mysql 約束和外鍵約束實例


1、約束保證數據的完整性和一致性。

2、約束分為表級約束和列級約束。(根據約束所針對的字段的數目的多少來決定)

列級約束:對一個數據列建立的約束

表級約束:對多個數據列建立的約束

列級約束即可以在列定義時聲明,也可以在列定義后聲明,

表級約束只能在列定義后聲明,表級約束很少用到。

3、按照功能來划分,約束類型包括

NOT NULL(非空約束)

PRIMARY KEY(主鍵約束)

UNIQUE KEY(唯一約束)

DEFAULT(默認約束)

FOREIGN KEY(外鍵約束)

 4、外鍵約束

保持數據一致性,完整性。

實現一對一或者一對多的關系。

 

實例

1、首先創建一個父表

mysql> CREATE TABLE provinces(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> pname VARCHAR(20) NOT NULL
-> );
Query OK, 0 rows affected (0.24 sec)

2、查看創建父表用的指令
mysql> SHOW CREATE TABLE provinces;
+----------+-------------------------------------------------------
-------------------------------------------------------------------
----------------------+
| Table | Create Table

|
+----------+-------------------------------------------------------
-------------------------------------------------------------------
----------------------+
| province | CREATE TABLE `province` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`pname` varchar(20) NOT NULL,
PRIMARY KEY (`id`)  #主鍵在創建的同時會自動的創建索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |(滿足第一個要求
+----------+-------------------------------------------------------
-------------------------------------------------------------------
----------------------+
1 row in set (0.02 sec)

3、創建子表

mysql> CREATE TABLE users(
-> id SMALLINT PRIMARY KEY AUTO_INCREMENT,
->
-> username VARCHAR(10) NOT NULL,
-> pid BIGINT,
-> FOREIGN KEY(pid) REFERENCES provinces (id)  #外鍵pid參照provinces表中的id
-> );
ERROR 1005 (HY000): Can't create table 'test.users' (errno: 150) #外鍵列必須與子鍵列有相似的數據類型
mysql>
mysql> CREATE TABLE users(
-> id SMALLINT PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED,
-> FOREIGN KEY(pid) REFERENCES province (id)
-> );
Query OK, 0 rows affected (0.17 sec)

有外鍵的數據表稱為子表,子表參照的表稱為父表。pid為外鍵列,id為參照列。

4、顯示參照列的索引

mysql> SHOW INDEXES FROM provinces;
+----------+------------+----------+--------------+-------------+-----------+--
----------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | C
rdinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+--
----------+----------+--------+------+------------+---------+---------------+
| province | 0 | PRIMARY | 1 | id | A |
0 | NULL | NULL | | BTREE | | |
+----------+------------+----------+--------------+-------------+-----------+--
----------+----------+--------+------+------------+---------+---------------+
1 row in set (0.07 sec)

mysql> SHOW INDEXES FROM province\G;  #以網格的形式顯示
*************************** 1. row ***************************
Table: province
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)

ERROR:
No query specified

5、顯示外鍵列的索引

mysql> SHOW INDEXES FROM users\G;
*************************** 1. row *************************  #兩個索引,一個主鍵索引
Table: users
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row *************************
Table: users
Non_unique: 1
Key_name: pid  #在pid字段上,系統自動創建索引
Seq_in_index: 1
Column_name: pid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)

ERROR:
No query specified

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM