首頁 > 軟體

mysql主鍵,外來鍵,非空,唯一,預設約束及建立表的方法

2022-07-26 18:05:29

前言:

在資料庫中,資料表是資料庫中最重要、最基本的操作物件,是資料儲存的基本單位。資料表被定義為列的集合,資料在表中是按照行和列的格式來儲存的。每一行代表一條唯一的記錄,每一列代表記錄中的一個域。

一、操作前提

建立資料表必須是在已經有資料庫的前提下的哈,首先需要切換到資料庫中,使用​​use​​命令進行切換。

mysql> use yunweijia;
Database changed
mysql>

二、mysql建立/新建表

create table <表名> (
欄位1,資料型別 [列級別約束條件] [預設值],
欄位2,資料型別 [列級別約束條件] [預設值],
欄位3,資料型別 [列級別約束條件] [預設值],
------
[表級別約束條件]
)

例如我們建立一個表結構如下:

欄位名稱

資料型別

備註

id

INT

員工編號

name

VARCHAR(25)

員工名稱

deptid

INT

所在部門編號

money

FLOAT

工資

1、首先我們需要建立一個資料庫;

mysql> create database test_db;
Query OK, 1 row affected (0.02 sec)

mysql>

2、然後進入這個資料庫;

mysql> use test_db;
Database changed
mysql>

3、建立表;

mysql> CREATE TABLE `test_user` (
-> `id` int(0) NULL DEFAULT NULL COMMENT '員工編號',
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '員工姓名',
-> `deptid` int(0) NULL DEFAULT NULL COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資'
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql>

4、檢視表;

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_user |
+-------------------+
1 row in set (0.00 sec)

mysql> desc test_user;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptid | int | YES | | NULL | |
| money | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

釋義:

​desc​​​命令是檢視​​mysql​​表結構的命令;

三、使用主鍵約束

主鍵,又稱主碼,是表中一列或多列的組合。主鍵約束(​​Primary KeyConstraint​​)要求主鍵列的資料唯一,並且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外來鍵來定義不同資料表之間的關係,並且可以加快資料庫查詢的速度。主鍵和記錄之間的關係如同身份證和人之間的關係,它們之間是一一對應的。主鍵分為兩種型別:單欄位主鍵多欄位聯合主鍵

1、單欄位主鍵

主鍵由一個欄位組成,​​SQL​​語句格式分為以下兩種情況。

(1.1)在定義列的時候指定主鍵

語法:

欄位名 資料型別 PRIMARY KEY [預設值]

範例:

mysql> CREATE TABLE `test_user_2` (
-> `id` int(0) PRIMARY KEY COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '員工姓名',
-> `deptid` int(0) NULL DEFAULT NULL COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資'
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql>

看下結果:

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_user |
| test_user_2 |
+-------------------+
2 rows in set (0.00 sec)

mysql> desc test_user_2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptid | int | YES | | NULL | |
| money | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

(1.2)在定義完所有列之後指定主鍵;

語法:

[CONSTRAINT <約束名>] PRIMARY KEY [欄位名]範例:

mysql> CREATE TABLE `test_user_3` (
-> `id` int(0) COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '員工姓名',
-> `deptid` int(0) NULL DEFAULT NULL COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資',
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql>

看下結果:

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_user |
| test_user_2 |
| test_user_3 |
+-------------------+
3 rows in set (0.00 sec)

mysql> desc test_user_3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptid | int | YES | | NULL | |
| money | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

2、多欄位聯合主鍵

主鍵由多個欄位聯合組成,語法規則如下:

PRIMARY KEY [欄位1, 欄位2, ...,欄位n]

範例:

mysql> CREATE TABLE `test_user_4` (
-> `id` int(0) COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '員工姓名',
-> `deptid` int(0) COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資',
-> PRIMARY KEY(name, deptid)
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql>

看下結果:

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_user |
| test_user_2 |
| test_user_3 |
| test_user_4 |
+-------------------+
4 rows in set (0.00 sec)

mysql> desc test_user_4;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(25) | NO | PRI | NULL | |
| deptid | int | NO | PRI | NULL | |
| money | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

語句執行後,便建立了一個名為​​test_user_4​​​的資料表,​​name​​​欄位和​​deptid​​​欄位組合在一起成為​​test_user_4​​的多欄位聯合主鍵。

四、使用外來鍵約束

外來鍵用來在兩個表的資料之間建立連線,可以是一列或者多列。一個表可以有一個或多個外來鍵。外來鍵對應的是參照完整性,一個表的外來鍵可以是空值,若不為空值,則每一個外來鍵值必須等於另一個表中主鍵的某個值

1、mysql中外來鍵是什麼?

外來鍵:首先他是表中的一個欄位,雖可以不是本表的主鍵,但要對應另外一個表的主鍵。外來鍵的主要作用是保證資料參照的完整性,定義外來鍵後,不允許刪除在另一個表中具有關聯關係的行。外來鍵的作用是保持資料的一致性、完整性。

2、什麼是主表?什麼是從表?

  • 主表(父表):對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的那個表是主表
  • 從表(子表):對於兩個具有關聯關係的表而言,相關聯欄位中外來鍵所在的那個表是從表

3、如何在​​mysql​​中建立外來鍵呢?

語法:

[CONSTRAINT <外來鍵名>] FOREIGN KEY 欄位名1 [ ,欄位名2,…]
REFERENCES <主表名> 主鍵列1 [ ,主鍵列2,…]

外來鍵名為定義的外來鍵約束的名稱,一個表中不能有相同名稱的外來鍵

欄位名表示子表需要新增外來鍵約束的欄位列;

主表名即被字表外來鍵所依賴的表的名稱;

主鍵列表示主表中定義的主鍵列,或者列組合。

例如我們新建一個​​test_dept​​的表,表結構如下:

欄位名稱資料型別備註idINT部門編號nameVARCHAR(30)部門名稱locationVARCHAR(50)部門位置

首先我們建立一下這個表:

mysql> CREATE TABLE `test_dept` (
-> `id` int(0) PRIMARY KEY COMMENT '部門編號',
-> `name` varchar(30) CHARACTER set utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '部門名稱',
-> `localhost` varchar(50) CHARACTER set utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '部門位置'
-> );
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_dept |
| test_user |
| test_user_2 |
| test_user_3 |
| test_user_4 |
+-------------------+
5 rows in set (0.00 sec)

mysql>

定義資料表​​test_user_5​​​,讓他的鍵​​deptid​​​作為外來鍵關聯到​​test_dept​​​中的主鍵​​id​​​,那麼我們的​​SQL​​語句應該這麼寫;

mysql> CREATE TABLE `test_user_5` (
-> `id` int(0) PRIMARY KEY COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '員工姓名',
-> `deptid` int(0) COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資',
-> CONSTRAINT fk_user_dept FOREIGN KEY(deptid) REFERENCES test_dept(id)
-> );
Query OK, 0 rows affected, 2 warnings (0.07 sec)

mysql>

通過上面的語句,可以看到,我們建立了一個名為​​test_user_5​​​的表,主鍵為​​id​​​,且建立了一個名為​​fk_user_dapt​​​的外來鍵約束,外來鍵名稱為​​deptid​​​,其依賴於​​test_dept​​​表中的主鍵​​ID​​。

注意點:

子表的外來鍵必須關聯父表的主鍵,且關聯欄位的資料型別必須匹配,如果型別不一樣,則建立子表時,就會出現錯誤​​ERROR 1005 (HY000):Can't create table 'database.tablename'(errno: 150)​​。

五、使用非空約束

非空約束(​​Not Null Constraint​​)指欄位的值不能為空。對於使用了非空約束的欄位,如果使用者在新增資料時沒有指定值,資料庫系統會報錯。

語法:

欄位名 資料型別 not null

那麼,我們根據上面的內容,再建立一個​​test_user_6​​​表,並指定​​name​​不能為空;

mysql> CREATE TABLE `test_user_6` (
-> `id` int(0) PRIMARY KEY COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '員工姓名',
-> `deptid` int(0) COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資'
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql>

六、使用唯一性約束

唯一性約束(​​Unique Constraint​​)要求該列唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複值。

語法:

欄位名 資料型別 UNIQUE

那麼,我們根據該內容,建立一個​​test_user_7​​​表,並指定​​id​​唯一;

mysql> CREATE TABLE `test_user_7` (
-> `id` int(0) UNIQUE PRIMARY KEY COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '員工姓名',
-> `deptid` int(0) COMMENT '所在部門編號',
-> `money` float NULL DEFAULT NULL COMMENT '工資'
-> );
Query OK, 0 rows affected, 2 warnings (0.05 sec)

mysql>

注意點:

​UNIQUE​​​和​​PRIMARY KEY​​​的區別:一個表中可以有多個欄位宣告為​​UNIQUE​​​,但只能有一個​​PRIMARY KEY​​​宣告;宣告為​​PRIMARY KEY​​​的列不允許有空值,但是宣告為​​UNIQUE​​​的欄位允許空值(​​NULL​​)的存在。

七、使用預設約束

預設約束(​​Default Constraint​​)指定某列的預設值。如男性同學較多,性別就可以預設為"男"。如果插入一條新的記錄時沒有為這個欄位賦值,那麼系統會自動為這個欄位賦值為"男"。

語法:

欄位名 資料型別 DEFAULT 預設值

那我們在這個基礎上,再新建一個​​test_user_8​​​表,並指定預設所在部門編號為​​0001​​,那麼建立的時候就應該這麼寫;

mysql> CREATE TABLE `test_user_8` (
-> `id` int(0) COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '員工姓名',
-> `deptid` int(0) DEFAULT 0001 COMMENT '所在部門編號',
-> `money` float COMMENT '工資'
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql>

八、設定表的屬性值自動增加

在資料庫應用中,經常希望在每次插入新記錄時,系統自動生成欄位的主鍵值。

可以通過為表主鍵新增​​AUTO_INCREMENT​​關鍵字來實現。

預設的,在​​MySQL​​​中​​AUTO_INCREMENT​​​的初始值是​​1​​​,每新增一條記錄,欄位值自動加​​1​​。一個表只能有一個欄位使用​​AUTO_INCREMENT​​約束,且該欄位必須為主鍵的一部分。​​AUTO_INCREMENT​​​約束的欄位可以是任何整數型別(​​TINYINT、SMALLIN、INT、BIGINT​​等)。

語法:

欄位名 資料型別 AUTO_INCREMENT

例如我們這裡建立一個​​test_user_9​​表,並執行員工編號自動遞增,那麼我們應該這麼寫:

mysql> CREATE TABLE `test_user_9` (
-> `id` int(0) PRIMARY KEY AUTO_INCREMENT COMMENT '員工編號' ,
-> `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '員工姓名',
-> `deptid` int(0) DEFAULT 0001 COMMENT '所在部門編號',
-> `money` float COMMENT '工資'
-> );
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql>

我們在這個表裡插入兩條資料試試看;

mysql> insert into test_user_9 (name, deptid, money) value ('張三', '0001', '10000'), ('李四', '0001', '10000'), ('王五', '0001', '10000');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from test_user_9;
+----+--------+--------+-------+
| id | name | deptid | money |
+----+--------+--------+-------+
| 1 | 張三 | 1 | 10000 |
| 2 | 李四 | 1 | 10000 |
| 3 | 王五 | 1 | 10000 |
+----+--------+--------+-------+
3 rows in set (0.00 sec)
mysql>

可以看到​​id​​確實遞增了哈。

到此這篇關於mysql主鍵,外來鍵,非空,唯一,預設約束及建立表的方法的文章就介紹到這了,更多相關mysql主鍵,外來鍵 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com