4.SQL約束介紹
(1)主鍵約束
A、基本內容
- 基本內容
- p r i m a r y primary primary k e y key key約束唯一表示數據庫中的每條記錄
- 主鍵必須包含唯一的值(UNIQUE)
- 主鍵不能包含NULL值(NOT NULL)
- 每個表都應該有一個主鍵,并且每個表只能有一個主鍵
- 遵循原則
- 逐漸應當是對用戶沒有意義的
- 永遠也不要更新主鍵
- 主鍵不應該包含動態變換的數據,如時間戳,創建時間列,修改時間列
- 逐漸應當由計算機自動生成
B、添加主鍵約束
-
創建表時添加主鍵
#創建數據表時添加 create table person(id INT PRIMARY KEY,last_name VARCHAR(100),first_name VARCHAR(100),address VARCHAR(100),city VARCHAR(100) );
最終輸出的表
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(20) | NO | PRI | ||
last_name | varchar(100) | YES | |||
first_name | varchar(100) | YES | |||
address | varchar(100) | YES | |||
city | varchar(100) | YES |
-
創建表后添加主鍵
# 創建后添加約束 create table person(id INT,last_name VARCHAR(100),first_name VARCHAR(100),address VARCHAR(100),city VARCHAR(100) );
- 在創建表后,可以使用
ALTER TABLE
關鍵字添加主鍵
ALTER TABLE category ADD PRIMARY KEY(cid);
- 在創建表后,可以使用
C、刪除主鍵約束
- 格式:
alter table category drop primary key;
D、自動增長列
auto_increment
(自動增長列)關鍵字:我們通常在每次插入新記錄時,數據庫自動生成字段的值
- 注意:自動增長列類型必須是整型,自動增長列必須為鍵(一般是主鍵),自動增長常與主鍵約束配合使用
- 創建表時添加自動增長
CREATE TABLE person2(id INT PRIMARY KEY AUTO_INCREMENT,last_name VARCHAR(100),first_name VARCHAR(100),address VARCHAR(100),city VARCHAR(100)
)
最終輸出的表
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(20) | NO | PRI | auto_increment | |
last_name | varchar(100) | YES | |||
first_name | varchar(100) | YES | |||
address | varchar(100) | YES | |||
city | varchar(100) | YES |
- 在創建表之后添加自動增長
ALTER TABLE person2 CHANGE id id INT AUTO_INCERMENT;
-
示例
向person中添加數據時,可以不為id字段設置值,或可以設置成null,數據庫將自動維護主鍵值
輸入
insert into person2(first_name,last_name) values('Bill','Gates'); 或 insert into person2(id,first_name,last_name) values(null,'Bill','Gates');
在輸入
select * from person2
語句之后,會輸出id last_name first_name address city 1 Gates Bill 2 Gates Bill 可以看到,從上往下,id的值是
-
其他
當主鍵不是自增長類型時
-
不為 id 字段設置值
執行插入語句時若不指定
id
字段值,數據庫會報錯。因為非自增長主鍵字段不允許有空值(一般定義為主鍵時會設置為NOT NULL
),缺少主鍵值就無法滿足數據完整性約束 。例如在 MySQL 中執行insert into person2(first_name,last_name) values('Bill','Gates');
會報錯,提示主鍵字段不能為空 。 -
將 id 設置成 null
同樣會報錯。因為主鍵具有唯一性和非空性約束,
null
值既不符合非空要求,也難以保證唯一性(多個null
無法區分 ) 。像執行insert into person2(id,first_name,last_name) values(null,'Bill','Gates');
,數據庫會提示違反主鍵約束相關錯誤 。
總之,非自增長主鍵要求在插入數據時必須明確指定一個符合其數據類型且唯一的有效值。
-
(2)非空約束
-
NOTNULL 約束強制列不進行NULL值,強制字段始終包含值,故說明如果不向字段中添加值,就無法插入新記錄或者更新記錄
-
示例
CREATE TABLE person3(id INT PRIMARY KEY,last_name VARCHAR(100) NOT NULL,first_name VARCHAR(100),address VARCHAR(100),city VARCHAR(100)
)
最終輸出的表
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(20) | NO | PRI | auto_increment | |
last_name | varchar(100) | NO | |||
first_name | varchar(100) | YES | |||
address | varchar(100) | YES | |||
city | varchar(100) | YES |
(3)唯一約束
-
基礎
- UNIQUE約束唯一標識數據庫表中的每條記錄
- UNIQUE和PRIMARY KEY 約束均為列或列集合提供了唯一性的保證
- PRIMARY KEY 擁有自動定義的UNIQUE約束
-
注意
- 每個表中可以有多個UNIQUE約束,但是每個表只能有一個PERIMARY KEY約束
-
示例
CREATE TABLE person3(id INT PRIMARY KEY,last_name VARCHAR(100) UNIQUE,first_name VARCHAR(100),address VARCHAR(100),city VARCHAR(100)
)
最終輸出的表
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(20) | NO | PRI | auto_increment | |
last_name | varchar(100) | YES | UNI | ||
first_name | varchar(100) | YES | |||
address | varchar(100) | YES | |||
city | varchar(100) | YES |
(4)默認值約束
- 當不填寫字段對應的值會使用默認值,如果填寫時以填寫的為準
- 示例
CREATE TABLE person3(id INT PRIMARY KEY,last_name varchar(100) NOT NULL,first_name varchar(100),address varchar(100),city varchar(100) DEFAULT '北京'
)
最終輸出的表
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(20) | NO | PRI | auto_increment | |
last_name | varchar(100) | YES | UNI | ||
first_name | varchar(100) | YES | |||
address | varchar(100) | YES | |||
city | varchar(100) | YES | 北京 |
四、窗口函數
- 基本語法:
SELECT SUM() OVER(PARTITION BY ___ ORDER BY ___) FROM TABLE;
PARTITION BY
與GROUP BY
的區別GROUP BY
分組聚合之后,分組字段有幾個取值,就會返回幾條結果PARTITION BY
返回的結果和原始數據表的條目數是一樣的