完整性約束
概念:約束條件與數據類型的寬度一樣,都是可選參數
作用:用於保證表與表之間的數據的完整性和准確性
可分為以下幾種:
PRIMARY KEY (PK) 標識該字段為該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK) 標識該字段為該表的外鍵
UNIQUE KEY (UK) 標識該字段的值是唯一的
NOT NULL 標識該字段不能為空
AUTO_INCREMENT 標識該字段的值自動增長(整數類型,而且為主鍵)
DEFAULT 為該字段設置默認值
PRIMARY KEY
primary key字段的值不為空且唯一
1單列做主鍵
方法一: not null+unique
create table department1(
id int not null unique, #主鍵
name varchar(20) not null unique,
comment varchar(100)
);
方法二: 在某一個字段后用primary key (推薦)
create table department2(
id int primary key, #主鍵
name varchar(20),
comment varchar(100)
);
方法三:在所有字段后單獨定義primary key
create table department3(
id int,
name varchar(20),
comment varchar(100),
primary key(id)
# constraint pk_name primary key(id) #創建主鍵並為其命名pk_name
);
2多列做主鍵(復合主鍵)
create table service( ip varchar(15), port char(5), service_name varchar(10) not null, primary key(ip,port) );
FOREIGN KEY
外鍵的使用條件:
1.兩個表類型必須是InnoDB表,MyISAM表暫時不支持外鍵(據說以后的版本有可能支持,但至少目前不支持);
2.外鍵列必須建立了索引,MySQL 4.1.2以后的版本在建立外鍵時會自動創建索引,但如果在較早的版本則需要顯示建立;
3.外鍵關系的兩個表的列必須是數據類型相似,也就是可以相互轉換類型的列,比如int和tinyint可以,而int和char則不可以;
基本操作
1創建外表:
第一種方法:建立從表的時候就和主表建立外鍵
CREATE TABLE TABLE_NAME(
'字段' 類型,
'字段' 類型,
... ...
FOREIGN KEY (從表字段) REFERENCES 主表(字段)
);
第二種方法:建表完成之后,也可以通過sql語句和主表建立聯系
ALTER TABLE 從表 ADD CONSTRAINT
外鍵名稱(形如:FK_從表_主表)
FOREIGN KEY (從表字段)
REFERENCES 主表(字段);
2刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱
表與表的對應關系
通過外鍵,我們可以快速建立表與表之間的關系
- 多對一:左表多條記錄對應右表一條記錄
- 一對多:左表一條記錄對應右表多條記錄
- 一對一:左表一條記錄對應右表一條記錄
- 多對多:左表多條記錄對應右表多條記錄
例:出版社、作者信息、書 出版社出版多本書(一對多) 一個作者寫一本書(一對一) 多個出版社出版同一作者的多本書(多對多)
多對一:
# 首先應該創建被關聯的表
主表 create table press( id int primary key auto_increment, name varchar(20) ); 從表 create table book( id int primary key auto_increment, name varchar(20), press_id int not null, foreign key(press_id) references press(id) on delete cascade
on update cascade
);
....
多對多:
create table author(
id int primary key auto_increment,
name varchar(20)
);
# 創建一張新表來存放作者表與書表的關系
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id) #創建外鍵並命名為fk_author
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);
一對一:
create table customer(
id int primary key auto_increment,
name varchar(20) not null,
qq varchar(10) not null,
phone char(16) not null
);
create table student(
id int primary key auto_increment,
class_name varchar(20) not null,
customer_id int unique, #該字段一定要是唯一的
foreign key(customer_id) references customer(id) #外鍵的字段一定要保證unique
on delete cascade
on update cascade
);
UNIQUE KEY
設置唯一的約束
方法一:在某一個字段后用 unique
create table department1(
id int,
name varchar(20) unique,
comment varchar(100)
);
方法二:在所有的字段后單獨定義unique
create table department2(
id int,
name varchar(20),
comment varchar(100),
constraint uk_name unique(name)
);
例如:
mysql> insert into department1 values(1,'IT','技術');
Query OK, 1 row affected (0.00 sec)
mysql> insert into department1 values(1,'IT','技術');
ERROR 1062 (23000): Duplicate entry 'IT' for key 'name'
聯合唯一:
create table service(
id int primary key auto_increment,
name varchar(20),
host varchar(15) not null,
port int not null,
unique(host,port) #聯合唯一
);
mysql> insert into service values
-> (1,'nginx','192.168.0.10',80),
-> (2,'haproxy','192.168.0.20',80),
-> (3,'mysql','192.168.0.30',3306)
-> ;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into service(name,host,port) values('nginx','192.168.0.10',80);
ERROR 1062 (23000): Duplicate entry '192.168.0.10-80' for key 'host'
NOT NULL
是否可空,null表示空,非字符串
not null - 不可空
null - 可空
mysql> create table t2(id int not null); #設置字段id不為空 mysql> desc t2; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+
AUTO_INCREMENT
約束字段為自動增長,被約束的字段必須同時被key約束
1創建自增字段
create table student(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') default 'male'
);
# 當不指定id時,會按照自增的id增長下去,當指定id時,會按照指定的id進行增長
2刪除自增字段
truncate student; # 請空表
注意:對於自增的字段,使用delete刪除后,在插入值,該字段仍按照刪除前的位置繼續增長
3設置自增字段
設置自增字段的起始值 auto_increment
mysql> alter table student auto_increment=3; mysql> show create table student; ....... ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
設置步長 auto_increment_increment
#基於會話級別
set session auth_increment_increment=2 #修改會話級別的步長
#基於全局級別的
set global auth_increment_increment=2 #修改全局級別的步長(所有會話都生效)
起始值auto_increment_offset
注意:
如果auto_increment_offset的值大於auto_increment_increment的值,則auto_increment_offset的值會被忽略
DEFAULT
默認值,創建列時可以指定默認值,當插入數據時如果未主動設置,則自動添加默認值
#設置id字段有默認值后,則無論id字段是null還是not null,都可以插入空,插入空默認填入default指定的默認值 mysql> create table t3(id int default 1); mysql> alter table t3 modify id int not null default 1;
