UNIQUE約束和主鍵的比較

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'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容