mysql多字段唯一約束

mysql唯一約束(unique key)要求該列唯一,允許為空,但只能出現(xiàn)一個空值。唯一約束可以確保一列或者幾列不出現(xiàn)重復(fù)值。

mysql多字段唯一約束

在創(chuàng)建表時設(shè)置唯一約束

在定義完列之后直接使用 UNIQUE 關(guān)鍵字指定唯一約束,語法規(guī)則如下:

<字段名> <數(shù)據(jù)類型> UNIQUE

創(chuàng)建數(shù)據(jù)表 tb_dept2,指定部門的名稱唯一,輸入的 sql 語句和運行結(jié)果如下所示。

mysql> CREATE TABLE tb_dept2     -> (     -> id INT(11) PRIMARY KEY,     -> name VARCHAR(22) UNIQUE,     -> location VARCHAR(50)     -> ); Query OK, 0 rows affected (0.37 sec) mysql> DESC tb_dept2; +----------+-------------+------+-----+---------+-------+ | Field    | Type        | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id       | int(11)     | NO   | PRI | NULL    |       | | name     | varchar(40) | YES  | UNI | NULL    |       | | location | varchar(50) | YES  |     | NULL    |       | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.08 sec)

提示:UNIQUE 和 PRIMARY KEY 的區(qū)別:一個表可以有多個字段聲明為 UNIQUE,但只能有一個 PRIMARY KEY 聲明;聲明為 PRIMAY KEY 的列不允許有空值,但是聲明為 UNIQUE 的字段允許空值的存在。

在修改表時添加唯一約束

在修改表時添加唯一約束的語法格式為:

ALTER TABLE <數(shù)據(jù)表名> ADD CONSTRAINT <唯一約束名> UNIQUE(<列名>);

修改數(shù)據(jù)表 tb_dept1,指定部門的名稱唯一,輸入的 SQL 語句和運行結(jié)果如下所示。

mysql> ALTER TABLE tb_dept1     -> ADD CONSTRAINT unique_name UNIQUE(name); Query OK, 0 rows affected (0.63 sec) Records: 0  Duplicates: 0  Warnings: 0 mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field    | Type        | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id       | int(11)     | NO   | PRI | NULL    |       | | name     | varchar(22) | NO   | UNI | NULL    |       | | location | varchar(50) | YES  |     | NULL    |       | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)

假設(shè)有一個需求是用戶給評論點贊,數(shù)據(jù)庫設(shè)計是三張表,用戶表t_user,評論表t_comment,點贊表t_praise,其中點贊表中有兩個外鍵分別是user_id和comment_id,分別關(guān)聯(lián)用戶表的用戶id和評論表的評論id,然后規(guī)定一個用戶只能給同一條評論點贊一次,有一種實現(xiàn)方式就是在插入點贊表之前,先通過user_id和comment_id查詢是否有點贊記錄,如果沒有的話,再執(zhí)行插入操作,否則返回您已經(jīng)點過贊了.這樣實現(xiàn)的話就會多一次數(shù)據(jù)庫查詢操作.更好的實現(xiàn)是,修改點贊表的user_id和comment_id為唯一約束,即這兩列不能同時相同,這樣在執(zhí)行插入操作的話,如果已經(jīng)點過贊了,數(shù)據(jù)庫會拋出違反了唯一鍵約束,這樣的話,就可以避免多一次數(shù)據(jù)庫查詢操作了.具體設(shè)置多列為唯一約束的語句是:

UNIQUE KEY <唯一約束名>(<列名>,...,<列名n>)
CREATE TABLE `t_praise` (   `id` int(12) unsigned NOT NULL AUTO_INCREMENT,   `comment_id` int(12) NOT NULL,   `user_id` int(12) NOT NULL,   KEY `FK_t_praise_comment` (`comment_id`),   KEY `FK_t_praise_user` (`user_id`),   UNIQUE KEY `UK_praise` (`comment_id`,`user_id`) )

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊12 分享