1. 程式人生 > 實用技巧 >完整性約束

完整性約束

完整性約束

概覽

為了防止不符合規範的資料進入資料庫,在使用者對資料進行插入、修改、刪除等操作時,DBMS自動按照一定的約束條件對資料進行監測,使不符合規範的資料不能進入資料庫,以確保資料庫中儲存的資料正確、有效、相容。

  約束條件與資料型別的寬度一樣,都是可選引數,主要分為以下幾種:

# NOT NULL :非空約束,指定某列不能為空; 
# UNIQUE : 唯一約束,指定某列或者幾列組合不能重複
# PRIMARY KEY :主鍵,指定該列的值可以唯一地標識該列記錄
# FOREIGN KEY :外來鍵,指定該行記錄從屬於主表中的一條記錄,主要用於參照完整性
設定嚴格模式:
    不支援對not null欄位插入null值
    不支援對自增長欄位插入”值
    不支援text欄位有預設值

直接在mysql中生效(重啟失效):
mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

配置檔案新增(永久失效):
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

約束某一個欄位
無符號的 int unsigned
不能為空 not null
預設值 default
唯一約束 unique
聯合唯一 unique(欄位1,欄位2)
自增 auto_increment
只能對數字有效.自帶非空約束
至少是unique的約束之後才能使用auto_increment
主鍵 primary key
一張表只能有一個
如果不指定主鍵,預設是第一個非空+唯一
聯合主鍵 primary key(欄位1,欄位2)
外來鍵 Foreign key
Foreign key(自己的欄位) references 外表(外表欄位)
外表欄位必須至少是"唯一"的

on update cascade #級聯更新
on delete cascade # 級聯刪除 儘量不用

不能重複  unique   值不能重複,但是null可以寫入多個
create table t13(
  id1 int unique,
  id2 int
)

聯合唯一 unique
create table t14(
    id int,
    server_name char(12),
    ip char(15),
    port char(5),
    unique(ip,port)
);

非空 + 唯一約束
第一個被定義為非空+唯一的那一列會成為這張表的primary key
一張表只能定義一個主鍵
create table t15(
    id int not null unique,
    username char(18) not null unique
);
create table t16(
    username char(18) not null unique,
    id int not null unique
);
create table t17(
    username char(18) not null unique,
    id int primary key
);

聯合主鍵
create table t18(
    id int,
    server_name char(12),
    ip char(15) default '',
    port char(5) default '',
    primary key(ip,port)
);

create table t19(
    id int primary key,
    server_name char(12),
    ip char(15) not null,
    port char(5) not null,
    unique(ip,port)
);

自增
create table t20(
    id int primary key auto_increment,
    name char(12)
);
insert into t20(name) values('alex');

外來鍵
班級表
create table class(
    cid int primary key auto_increment,
    cname char(12) not null,
    startd date
)# 學生表
# create table stu(
#     id int primary key auto_increment,
#     name char(12) not null,
#     gender enum('male','female') default 'male',
#     class_id int,
#     foreign key(class_id) references class(cid)
# )


create table stu2(
    id int primary key auto_increment,
    name char(12) not null,
    gender enum('male','female') default 'male',
    class_id int,
    foreign key(class_id) references class(cid) #設定外來鍵 涉及class表的cid
    on update cascade  #級聯更新
    on delete cascade  # 級聯刪除 儘量不用
)