
about-BY-gentle.jpg
UNIQUE約束和主鍵的比較
可以使用 UNIQUE 約束確保在非主鍵列中不輸入重復(fù)的值。盡管 UNIQUE 約束和 PRIMARY KEY 約束都強(qiáng)制唯一性,
但想要強(qiáng)制一列或多列組合(不是主鍵)的唯一性時(shí)應(yīng)使用 UNIQUE 約束而不是 PRIMARY KEY 約束。
原因:可以對(duì)一個(gè)表定義多個(gè) UNIQUE 約束,但只能定義一個(gè) PRIMARY KEY 約束。
而且,UNIQUE 約束允許 NULL 值,這一點(diǎn)與 PRIMARY KEY 約束不同。不過(guò),當(dāng)與參與 UNIQUE 約束的任何值一起使用時(shí),每列只允許一個(gè)空值。
外鍵中:
FOREIGN KEY 約束可以引用 UNIQUE 約束
什么時(shí)候用UNIQUE約束,而不是主鍵
創(chuàng)建唯一約束可確保在未參與主鍵的特定列中不輸入重復(fù)值。盡管唯一約束和主鍵都強(qiáng)制唯一性,
但以下情況如下,則應(yīng)向表附加唯一約束而不是主鍵約束:
- 希望在某一列或某一組列中強(qiáng)制唯一性。您可以向表附加多個(gè)唯一約束,但只能向表附加一個(gè)主鍵約束。
- 希望在允許空值的列中強(qiáng)制唯一性。您可以向允許空值的列附加唯一約束,但只能向不允許空值的列附加主鍵約束。當(dāng)向允許空值的列附加唯一約束時(shí),請(qǐng)確保在所約束的列中最多只有一行包含空值。
唯一可以多個(gè)實(shí)例:
*************************** 1. row ***************************
Table: unique8
Create Table: CREATE TABLE `unique8` (
`id` int(11) NOT NULL,
`age` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `age` (`age`),
UNIQUE KEY `num` (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
唯一的唯一性驗(yàn)證實(shí)列:
mysql> select * from unique8;
+----+------+------+
| id | age | num |
+----+------+------+
| 1 | NULL | NULL |
+----+------+------+
1 row in set (0.01 sec)
mysql> insert into unique8 values(1,null,null);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into unique8 values(1,22,22);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into unique8 values(2,22,22);
Query OK, 1 row affected (0.06 sec)
mysql> insert into unique8 values(3,22,22);
ERROR 1062 (23000): Duplicate entry '22' for key 'age'