3、UNIQUE 約束
約束唯一標識數據庫表中的每條記錄。
創建一張測試表
CREATE TABLE `test`.`info`( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `idCard` VARCHAR(18) UNIQUE NOT NULL, -- 直接在字段上添加唯一約束 `mobile` VARCHAR(11), PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_estonian_ci;
添加唯一約束UNIQUE
/* 除了上面的添加唯一約束的方法以外, 如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,寫法如下: uc_idCard約束由mobile和idCard組合成唯一約束。 */ CREATE TABLE `test`.`info`( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `idCard` VARCHAR(18) UNIQUE, `mobile` VARCHAR(11), PRIMARY KEY (`id`), CONSTRAINT `uc_idCard` UNIQUE (`mobile`,`idCard`) ) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_estonian_ci; 如果在存在表的情況下,添加唯一約束
-- 無名字的約束 ALTER TABLE `info` ADD UNIQUE (`idCard`);
-- uc_idCard約束由mobile和idCard組合成唯一約束 ALTER TABLE `info` ADD CONSTRAINT `uc_idCard` UNIQUE (`mobile`,`idCard`);
撤銷 UNIQUE 約束
-- 移除指定字段的約束 ALTER TABLE `info` DROP INDEX `idCard`; -- 移除有名字的約束 ALTER TABLE `info` DROP INDEX `uc_idCard`;
向 UNIQUE 約束添加數據
-- 添加一條基礎數據 INSERT INTO `info`(`idCard`,`mobile`) VALUES('99999','1111'); -- 添加一條idCard重復的記錄 INSERT INTO `info`(`idCard`,`mobile`) VALUES('99999','2222'); 結果: 錯誤代碼: 1062 DUPLICATE entry '99999' FOR KEY 'idCard'; -- 在唯一約束中添加 NULL INSERT INTO `info`(`idCard`,`mobile`) VALUES(NULL,'1111'); -- 再次添加NULL INSERT INTO `info`(`idCard`,`mobile`) VALUES(NULL,'2222'); 結果: id idCard mobile ------------------------- 6 (NULL) 1111 7 (NULL) 2222
原因:因為 NULL != NULL