MySql 約束條件


約束

sql約束:約束用於限制加入表的數據的類型。是一種限制,它通過對表的行或列的數據做出限制,來確保表數據的完整性、唯一性可以在創建表時規定約束(通過 CREATE TABLE 語句),或者在表創建之后也可以(通過 ALTER TABLE 語句)。

數據類型的屬性

MySQL關鍵字 含義
NULL 數據列可包含NULL值
NOT NULL 數據列不允許包含NULL值
DEFAULT 默認值
PRIMARY KEY 主鍵
AUTO_INCREMENT 自動遞增,適用於整數類型
UNSIGNED 無符號
CHARACTER SET name 指定一個字符集
1、not null 約束:強制列不接受 NULL 值,強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。
例:create table table_name(id int not null,name varchar(255) not null); # 強制id和name不能為空

2、unique 約束:唯一標識數據庫表中的每條記錄,確保表中的一列數據沒有相同的值
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束
例:create table時在id列創建unique約束
create table table_name(id int not null,name varchar(255) not null, unique (id));
例2:為多個列定義unique
create table table_name(id int not null,name varchar(255) not null, constraint uc_personID unique (id,name))
例3:表已創建情況下,創建unique約束
alter table table_name add unique(id);
多個:alter table table_name add constraint uc_personid unique(id,name);
例4:撤銷unique
alter table table_name drop index uc_personid;

3、PRIMARY KEY 約束:PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。 primary key = unique +  not null 
例:create table時在id列創建PRIMARY KEY約束
create table table_name(id int not null,name varchar(255) not null, PRIMARY KEY(id));
例2:為多個列定義PRIMARY KEY
create table table_name(id int not null,name varchar(255) not null, constraint pk_personID PRIMARY KEY (id,name))
例3:表已創建情況下,創建PRIMARY KEY約束
alter table table_name add PRIMARY KEY(id);
多個:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);
例4:撤銷PRIMARY KEY
alter table table_name drop index uc_personid;

4、FOREIGN KEY 約束:一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY
外鍵
外鍵用來在兩個表數據之間建立鏈接,它可以是一列或多列。一個表可以有一個或多個外鍵
外鍵對應得是參照完整性,一個表得外鍵可以為空值,若不為空值,則每一個外鍵值必須等於另一個表中主鍵得某個值。
FOREIGN KEY 約束用於預防破壞表之間連接的動作。
FOREIGN KEY 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。
例:create table時在id列創建 FOREIGN KEY 約束
create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id),FOREIGN KEY (Id_P) REFERENCES table_name2(Id_P));
例2:為多個列定義 FOREIGN KEY 
create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id) constraint fk_pertb2 FOREIGN KEY (Id_P)
REFERENCES table_name2(Id_P) )
例3:表已創建情況下,創建 FOREIGN KEY 約束
alter table table_name add ADD FOREIGN KEY (Id_P) REFERENCES table_name1(Id_P);
多個:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);
例4:撤銷 FOREIGN KEY 
alter table table_name drop FOREIGN KEY fk_pertb2;

外鍵約束
mysql> create table bookcategory(
    -> category_id int primary key,
    -> category varchar(20),
    -> parent_id int);
mysql> create table bookinfo(
    -> book_id int primary key,
    -> book_category_id int,
    -> constraint fk_cid foreign key(book_category_id) references bookcategory(category_id));

5、CHECK 約束:用於限制列中的值的范圍
如果對單個列定義 CHECK 約束,那么該列只允許特定的值。
如果對一個表定義 CHECK 約束,那么此約束會在特定的列中對值進行限制。
例:create table時在id列創建 CHECK 約束
create table table_name(id int not null,name varchar(255) not null,CHECK(id>0));
例2:為多個列定義 CHECK 約束
create table table_name(id int not null,name varchar(255) not null, constraint chk_tbname CHECK(id>0 and name='xxx'));
例3:表已創建情況下,創建 CHECK 約束
alter table table_name ADD constraint chk_tbname CHECK (Id_P>0 AND name='xxx'); 
例4:撤銷 CHECK
alter table table_name drop constraint chk_tbname;

6、DEFAULT 約束:用於向列中插入默認值
如果沒有規定其他的值,那么會將默認值添加到所有的新記錄。
例:create table時在id列創建 DEFAULT 約束,類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值
create table table_name(id int not null,name varchar(255) not null DEFAULT 'lxq',timedate date DEFAULT GETDATE());
例2:表已創建情況下,創建 DEFAULT 約束
alter table table_name alter name set DEFAULT 'lxq2';
例3:撤銷 DEFAULT
alter table table_name ALTER name DROP DEFAULT;

約束條件的簡單運用

"""
primary key:主鍵,唯一標識,表都會擁有,不設置為默認找第一個 不空,唯一 字段,未標識則創建隱藏字段
foreign key:外鍵
unique:唯一性數據, 該條字段的值需要保證唯一,不能重復

auto_increment:自增,只能加給key的int類型字段輔助修飾

not null:不為空 - 針對一些字段,如注冊時的用戶名,出生人的性別等,這些需求下的字段,只不能設置為Null,必須要對其賦值
null 可為空
default:默認值 - 對有默認值意外的字段進行賦值時,有默認值的字段會被賦默認值

unsigned:無符號 - 存儲的數字從0開始
zerofill:0填充 - 存整數時數據長度小於取值范圍長度,會在數字左方用0填充
"""

mysql>: create table td1 (x int, y int default 0, z int default 100);
    
#清空表,並清空主鍵自增記錄
truncate table 數據庫.表名;

注:
1.鍵是用來講的io提供存取效率
2.聯合唯一
create table web (
    ip char(16),
    port int,
    unique(ip,port)
);
3.聯合主鍵
create table web (
    ip char(16),
    port int,
    primary key(ip,port)
);

# eg:1
# 單列唯一
create table t20 (
	id int unique
);
# 聯合唯一
create table web (
    ip char(16),
    port int,
    unique(ip,port)
);
# 如果聯合兩個字段,兩個字段全相同才相同,否則為不同
insert into web values ('10.10.10.10', 3306), ('10.10.10.10', 3306);

# 注: 
# 1.表默認都有主鍵, 且只能擁有一個主鍵字段(單列主鍵 | 聯合主鍵)
# 2.沒有設置主鍵的表, 數據庫系統會自上而下將第一個規定為unique not null字段自動提升為primary key主鍵
# 3.如果整個表都沒有unique not null字段且沒有primary key字段, 系統會默認創建一個隱藏字段作為主鍵
# 4.通常必須手動指定表的主鍵, 一般用id字段, 且id字段一般類型為int, 因為int類型可以auto_increment

# eg:2
create table t21(id int auto_increment); # 自增約束必須添加給key的字段
# eg:3
create table t21(id int primary key auto_increment); # 自增要結合key,不賦值插入,數據會自動自增, 且自增的結果一直被記錄保留
# eg:4
# 聯合主鍵
create table t22(
	ip char(16),
    port int,
    primary key(ip,port)
);
# 如果聯合兩個字段,兩個字段全相同才相同,否則為不同
insert into web values ('10.10.10.10', 3306), ('10.10.10.10', 3306);


免責聲明!

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



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