Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ràng buộc duy nhất &chèn hoặc cập nhật cho cả MySQL và SQLite

Giải pháp SQLite (nguyên tắc tương tự nên áp dụng trong mysql)

Bạn có thể chỉ cần thêm một chỉ mục DUY NHẤT (ít nhất là cho SQLite mà chỉ mục này dành cho) để bạn có thể có:-

DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
  `id` INTEGER, //<<<<<<<<<< See notes below
  `uuid` VARCHAR ( 64 ) NOT NULL,
  `name` VARCHAR ( 32 ) NOT NULL,
  `date` BIGINT NULL,
  PRIMARY KEY ( `id` )
);
CREATE UNIQUE INDEX IF NOT EXISTS uuid_date ON `users` (`uuid`,`date`); //<<<<<<<<<<
  • Lưu ý AUTO_INCREMENT dẫn đến lỗi cho SQLite vì nó không phải là từ khóa, từ khóa chính xác trong SQlite là AUTOINCREMENT . Tuy nhiên, nó đã bị bỏ qua vì nó có thể không được yêu cầu như INTEGER PRIMARY KEY (hoặc ẩn bằng cách xác định PRIMARY KEY (id) ) sẽ dẫn đến một id uniqiue được tạo tự động nếu không có giá trị nào được cung cấp cho cột khi chèn.

  • SQLite yêu cầu INTEGER, không phải INT, cho id được tạo tự động. NOT NULL và UNIQUE được ngụ ý vì vậy không cần chỉ định chúng.

Dưới đây là hai bộ ví dụ chèn từng bản sao kết hợp uuid / date, do đó cập nhật thay vì chèn và cũng chèn cùng uuid nhưng khác ngày và ngược lại:-

INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 1st','20180101');
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','20180101'); -- <<<< DUPLICATE 
INSERT OR REPLACE INTO `users` VALUES(null,'Fred99999999','Fred Bloggs the 2nd','20180101'); -- <<<< different uuid same date
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','99999999'); -- <<<< same uuid different date

INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred99999999','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','99999999');

SELECT * FROM `users`;

Kết quả là:-



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi BIGINT UNSIGNED thành INT

  2. MySQL AUTO_INCREMENT không ROLLBACK

  3. Amazon DynamoDB - Thiết kế bảng dựa trên tình bạn

  4. Hàm mysql_escape_string () không được dùng nữa hãy sử dụng mysql_real_escape_string () Codeigniter

  5. Cách cập nhật dữ liệu tuần tự hóa trong MySQL