SQL常見約束條件


SQL約束

1. 約束的概念

  1. 約束是對表中的字段通過添加約束條件,來保證數據的正確和可靠性。

2. 常見的約束

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

3.UNIQUE 唯一約束

1.特點

  • 不允許用重復數據出現
  • 允許為null ,但不允許有多個null,只能有一個,null也是不許重復的
  • 每個表可以有多個字段設置 UNIQUE約束。

2.添加 UNIQUE 約束

1.創建表時添加

下面的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 UNIQUE 約束:

MySQL:

CREATE TABLE Persons(
    Id_P int NOT NULL,
    LastName varchar(50) NOT NULL,
    FirstName varchar(50),
    Address varchar(50),
    City varchar(50),
    UNIQUE (Id_P)  -- 采用的表級約束,對Id_P 字段添加的唯一約束, ()里面可以有多個字段,但每個字段長度不能超過767字節。
   )
CREATE TABLE Persons(
    Id_P int NOT NULL UNIQUE , -- 采用的列級約束,對Id_P 字段添加的唯一約束,長度不能超過767字節。
    LastName varchar(50) NOT NULL,
    FirstName varchar(50),
    Address varchar(50),
    City varchar(50),
   )

SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
    Id_P int NOT NULL UNIQUE,  -- 采用的列級約束,對Id_P 字段添加的唯一約束,長度不能超過767字節。
    LastName varchar(50) NOT NULL,
    FirstName varchar(50),
    Address varchar(50),
    City varchar(50)
)

2.表已存在時添加

當表已被創建時,如需在 "Id_P" 列創建 UNIQUE 約束,請使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD UNIQUE (Id_P);    -- 通過修改表結構的方式,來添加表級字段約束
ALTER TABLE Persons
  MODIFY COLUMN Id_P INT  UNIQUE  ;   -- 通過修改表結構的方式,來添加列級字段約束

3. 重命名 UNIQUE約束

1.創建表時重命名

在創建表的時候默認的時候約束名字就叫UNIQUE,如果我們想更改約束名字請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL,
     LastName varchar(50) NOT NULL,
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50),
     CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)  --  UNIQUE 默認用()中第一個字段名命名。 uc_PersonID 是別名。
);

2.表已存在時重命名

當表已被創建時,如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP INDEX uc_PersonID,   --- 先刪除 UNIQUE約束 的索引
ADD CONSTRAINT PersonID UNIQUE (Id_P,LastName);  --- 在重新創建 UNIQUE約束

4. 刪除UNIQUE約束

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID   -- 這里只能通過DROP來刪除約束,不能通過修改表的字段結構的方式去修改

SQL Server / Oracle / MS Access::

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID -- 這里只能通過DROP來刪除約束,不能通過修改表結構的方式去修改

4. NOT NULL 非空約束

1.特點

  • 強制字段不接受 NULL 值。
  • NOT NULL 約束強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。
  • 一個表中允許 多個字段設置 NOT NULL非空約束

2.添加 NOT NULL約束

1.創建表時添加

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL,   -- 采用的列級約束,對字段添加 非空約束
     LastName varchar(50) NOT NULL, -- 采用的列級約束,對字段添加 非空約束
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50)
);

2.表已存在時添加

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
  MODIFY COLUMN LastName VARCHAR (20) NOT NULL ;   -- 通過修改字段的方式,來修改字段約束,添加上NOT NULL。

3.刪除,修改 NOT NULL約束

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
  MODIFY COLUMN LastName VARCHAR (20) NULL ; --通過修改字段的方式,來修改字段約束,把NOT NULL修改成NULL,或直接刪除不寫約束來刪除非空約束

5. PRIMARY KEY 主鍵約束

1.特點

  • PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
  • 主鍵必須包含唯一的值。
  • 主鍵列不能包含 NULL 值。
  • 每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
  • 不能給多個字段設置多個主鍵, 一個主鍵可以保函多個字段。

2. 添加 PRIMARY KEY 主鍵約束

1.創建表時添加

下面的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 PRIMARY KEY 約束:
MySQL /SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL PRIMARY KEY,   -- 采用的列級約束,對Id_P 字段添加的主鍵約束。 
     LastName varchar(50) NOT NULL,   --- 表只能有一個主鍵,但是可以保函多個字段,但不是每個字段都可以設置一個主鍵
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50)
);
CREATE TABLE Persons(
     Id_P int NOT NULL,
     LastName varchar(50) NOT NULL,
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50),
     PRIMARY KEY (Id_P,LastName)  -- 采用的表級約束,對Id_P 字段添加的主鍵約束,() 里可以添加多個字段,以多個字段的值為標准作為主鍵約束條件
                                  --- 表只能有一個主鍵,但是可以保函多個字段,但不是每個字段都可以設置一個主鍵
);

2.表已存在時 添加 PRIMARY KEY

MySQL /SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD PRIMARY KEY (Id_P) 

3. 重命名 PRIMARY KEY約束名

1.創建表時重命名

在創建表的時候默認的時候約束名字就叫PRIMARY,如果我們想更改約束名字請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
     Id_P int NOT NULL,
     LastName varchar(50) NOT NULL,
     FirstName varchar(50),
     Address varchar(50),
     City varchar(50),
     CONSTRAINT uc_PersonID PRIMARY KEY(Id_P,LastName)  --  PRIMARY KEY默認用PRIMARY作為主鍵的約束名。 uc_PersonID 是別名。
);

2.表已存在時重命名

當表已被創建時,如需命名 PRIMARY KEY約束名,並定義多個列的 PRIMARY KEY約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP INDEX uc_PersonID,   --- 先刪除 PRIMARY KEY約束名
ADD CONSTRAINT PersonID PRIMARY KEY(Id_P,LastName);  --- 在重新創建 PRIMARY KEY約束名

4. 刪除PRIMARY KEY主鍵約束

MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY   -- 這里只能通過DROP來刪除約束,不能通過修改表的字段結構的方式去修改

SQL Server / Oracle / MS Access::

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID -- 這里只能通過DROP來刪除約束,不能通過修改表結構的方式去修改
                            -- 通過約束名字刪除約束

6. FOREIGN KEY 外鍵約束

1.特點

  • 一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY,保證兩個字段的一致性。
  • FOREIGN KEY 約束用於預防破壞表之間連接的動作
  • FOREIGN KEY 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。

2.添加FOREIGN KEY 外鍵約束

1.創建表添加

我們知道FOREIGN KEY約束是需要關聯另一張表的主鍵的,所以我們創建一個departments 部門表,然后用employees 員工表去管理部門表。SQL如下:
departments 表:

CREATE TABLE departments(
	department_id INT PRIMARY KEY, -- 這里設置為主鍵
	department_name VARCHAR(50) NOT NULL
)

employees 表:

CREATE TABLE employees(
	employee_id INT PRIMARY KEY,
	employee_name VARCHAR(50) NOT NULL,
	`email` VARCHAR(25),
	department_id INT(3) ZEROFILL NOT NULL, -- 這個字段的數據類型,必須與 departments表的department_id字段 的數據類型一致
	
	FOREIGN KEY (department_id) REFERENCES departments(department_id)  
                                            --  用employees表的department_id 去引用 departments表的department_id字段 做外鍵關聯。
)

2.表已存在時添加

departments 表:

employee_id employee_name
001 人事部
002 財務部
003 銷售部

employees 表:

employee_id employee_name email department_id
1 張飛 12222@163.com 001
2 關羽 12222@163.com 002
3 趙雲 12222@163.com 003
ALTER TABLE employees
ADD FOREIGN KEY (department_id) REFERENCES departments(department_id) -- 采用給表添加表記約束的方法,添加外鍵

3.重命名FOREIGN KEY外鍵約束名

1.創建表重命名

CREATE TABLE employees(
	employee_id INT PRIMARY KEY,
	employee_name VARCHAR(50) NOT NULL,
	`email` VARCHAR(25),
	department_id INT(3) ZEROFILL NOT NULL, -- 這個字段的數據類型,必須與 departments表的department_id字段 的數據類型一致
	
	CONSTRAINT  fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id)  
                                           --  用employees表的department_id 去引用 departments表的department_id字段 做外鍵關聯。
)

2.表已存在時重命名

ALTER TABLE employees
DROP FOREIGN KEY fk_department_id, -- 先刪除外鍵約束
ADD CONSTRAINT  fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id) 
                                     -- 在采用給表添加表記約束的方法,添加外鍵

4.刪除FOREIGN KEY外鍵約束

mySql:

ALTER TABLE Orders
DROP FOREIGN KEY fk_department_id  -- fk_department_id外鍵是約束名字

SQL Server / Oracle / MS Access::

ALTER TABLE Orders
DROP CONSTRAINT fk_department_id  -- fk_department_id外鍵是約束名字

7. CHECK檢查約束

1.特點

  • CHECK 約束用於限制列中的值的范圍。

2.待完成

8.DEFAULT 默認約束

1.特點

  • DEFAULT 約束用於向列中插入默認值
  • 如果沒有規定其他的值,那么會將默認值添加到所有的新記錄。

2.添加 DEFAULT 約束

1.創建表時添加

下面的 SQL 在 "Persons" 表創建時在 "City" 列創建 DEFAULT 默認約束:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons(
    Id_P INT NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    FirstName VARCHAR(50),
    Address VARCHAR(50),
    City VARCHAR(50) DEFAULT '大連'  -- 在不指定字段的值的時候,默認值為大連
    
 )

通過使用類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值:

待完成

2.表已存在時添加

當表已被創建時,如需在 "City" 列創建 DEFAULT 約束,請使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50)  DEFAULT  '大連' ;   -- 通過修改表結構的方式,來對字段添加約束
ALTER TABLE Persons
ALTER City SET DEFAULT '大連';     -- 直接對字段添加DEFAULT

3. 修改DEFAULT約束的值

當表和字段的默認約束都存在時,可以添加約束的方法重新設置 默認約束的值,請使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50)  DEFAULT  '大連' ;   -- 通過修改表結構的方式,約束的默認值
ALTER TABLE Persons
ALTER City SET DEFAULT '大連';     -- 通過添加約束的方法也可以修改 已有的約束值

4. 刪除DEFAULT約束

MySQL / SQL Server / Oracle / MS Access::

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT   -- 通過DROP來刪除指定字段的 DEFAULT約束
ALTER TABLE Persons
MODIFY COLUMN City VARCHAR(50)    -- 通過修改字段,把字段的約束條件去掉


免責聲明!

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



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