MySQL基礎(五)

約束

概述

  • 爲了保證數據的一致性和完整性,SQL規範以約束的方式對錶數據進行額外的條件限制。
  • 約束是表級的強制規定。
  • 能夠在建立表的時候添加約束,或者在表建立以後數據添加以前添加約束。

約束類型

有以下的六大約束:sql

  • NOT NULL,非空約束,規定某個字段不能爲空。
  • UNIQUE,惟一約束,規定某個字段在整個表中是惟一的。
  • PRIMARY KEY,主鍵,非空且惟一。
  • CHECK,檢查約束。
  • DEFAULT,默認值。
  • FOREIGN KEY,外鍵。

須要注意的是,MySQL不支持check約束,可是可使用check約束,沒有任何效果。ui

分類

  • 根據約束數據列的限制,約束能夠分爲:
    • 單列約束:每一個約束只能約束一列。
    • 多列約束:每一個約束能夠約束多列。
CREATE TABLE 表名(
	列名 字段類型 單列約束,
    列名 字段類型 單列約束,
    多列約束(列名1,列名2)
);
複製代碼
  • 根據約束的做用範圍,約束能夠分爲:
    • 列級約束:只能做用在一個列上,而且是根據列的定義後面。
    • 表級約束:能夠做用在多個列上,不和列在一塊兒,而是單獨定義。
CREATE TABLE 表名(
	列名 字段類型 列級約束,
    列名 字段類型 列級約束,
    表級約束(列名1,列名2)
);
複製代碼

列級約束,六大約束都支持,可是外鍵約束沒有效果。spa

表級約束,除了非空、默認約束,其餘約束都支持。code

建立表的時候添加列級約束

  • 建立學生表:
CREATE TABLE stu_info (
	id INT PRIMARY KEY,# 主鍵
	stu_name VARCHAR ( 255 ) NOT NULL,# 非空
	gender CHAR ( 1 ) CHECK (
	gender IN ( '男', '女' )),# 檢查
	seat INT UNIQUE,# 惟一
	age INT DEFAULT 18 # 默認約束
);
複製代碼

建立表的時候添加表級約束

  • 建立課程表和學生表:
CREATE TABLE major ( 
	id INT PRIMARY KEY, 
	`name` VARCHAR ( 255 ) 
);

CREATE TABLE stu_info (
	id INT ,
	stu_name VARCHAR ( 255 ) not null ,
	gender CHAR ( 1 ) ,
	seat INT ,
	age INT DEFAULT 18,
	major_id int,
	CONSTRAINT pk_id PRIMARY KEY (id),
	CONSTRAINT uk_seat UNIQUE (seat) ,
	CONSTRAINT fk_marjor_id FOREIGN KEY (major_id) REFERENCES major(id)
);
複製代碼

主鍵和惟一的區別

保證惟一性 是否容許爲空 一個表中能夠有多少個 是否容許組合
主鍵 × 最多有1個 √,可是不推薦
惟一 能夠有多個 √,可是不推薦

外鍵的特色

  • 要求在從表設置外鍵。
  • 要求從表的外鍵列的類型要和主表的關聯列的類型要求一致或兼容,可是名稱不要求一致。
  • 主表的關聯列必須是一個key(通常是主鍵或惟一鍵)。

修改表時添加約束

語法:

# 添加列級約束
ALTER TABLE 表名 MODIFY COLUMN 列名 字段類型 新約束;
# 添加表級約束
ALTER TABLE 表名 ADD CONSTRAINT 約束名 約束類型 (字段名) [外鍵的引用];
複製代碼

應用示例:

CREATE TABLE major ( 
	id INT PRIMARY KEY, 
	`name` VARCHAR ( 255 ) 
);
CREATE TABLE stu_info (
	id INT ,
	stu_name VARCHAR ( 255 ) NOT NULL,# 非空
	gender CHAR ( 1 ) ,
	seat INT UNIQUE,# 惟一
	age INT ,
	major_id int
);
# 修改表時添加約束
ALTER TABLE stu_info MODIFY COLUMN id INT PRIMARY KEY; 
ALTER TABLE stu_info MODIFY COLUMN age INT DEFAULT 18; 
ALTER TABLE stu_info ADD CONSTRAINT fk_major_id FOREIGN KEY (major_id) REFERENCES major(id);
複製代碼

修改表時刪除約束

CREATE TABLE major ( 
	id INT PRIMARY KEY, 
	`name` VARCHAR ( 255 ) 
);
CREATE TABLE stu_info (
	id INT PRIMARY KEY,
	stu_name VARCHAR ( 255 ) NOT NULL,# 非空
	gender CHAR ( 1 ) ,
	seat INT UNIQUE,# 惟一
	age INT DEFAULT 18,
	major_id int,
	CONSTRAINT fk_marjor_id FOREIGN KEY (major_id) REFERENCES major(id)
);
# 修改表時刪除非空約束
ALTER TABLE stu_info MODIFY COLUMN stu_name  VARCHAR(255) ;
# 修改表時刪除默認約束
ALTER TABLE stu_info MODIFY COLUMN age INT;
# 修改表時刪除主鍵
ALTER TABLE stu_info DROP PRIMARY KEY;
# 修改表時刪除主鍵
# 查詢惟一鍵 show index from stu_info
ALTER TABLE stu_info DROP INDEX seat;
# 修改表時刪除外鍵
ALTER TABLE stu_info DROP FOREIGN KEY fk_marjor_id;
複製代碼

標識列

概念:

  • 又稱爲自增加列,能夠不用手動插入值,系統提供默認的序列值。

應用示例

  • 建立表的時候設置標識列:
# 刪除表
DROP TABLE IF EXISTS student;
# 建立表的時候設置標識列
CREATE TABLE student ( 
	id INT PRIMARY KEY auto_increment, 
	`name` VARCHAR ( 255 ) 
);
# 新增數據
INSERT INTO student(`name`) VALUES ('xxx');
複製代碼
  • 修改表時設置標識列:
# 刪除表
DROP TABLE IF EXISTS student;
# 建立表的時候設置標識列
CREATE TABLE student ( 
	id INT PRIMARY KEY , 
	`name` VARCHAR ( 255 ) 
);
# 修改表的時候設置標識列
ALTER TABLE student MODIFY COLUMN id PRIMARY KEY auto_increment;
# 新增數據
INSERT INTO student(`name`) VALUES ('xxx');
複製代碼
  • 修改表時刪除標識列:
# 刪除表
DROP TABLE IF EXISTS student;
# 建立表的時候設置標識列
CREATE TABLE student ( 
	id INT PRIMARY KEY auto_increment, 
	`name` VARCHAR ( 255 ) 
);
# 修改表時刪除標識列
ALTER TABLE student MODIFY COLUMN id PRIMARY KEY;
複製代碼

特色:

  • 標識列必須不必定和主鍵搭配,可是要求是一個key。rem

  • 一個表中至多有一個標識列。string

  • 標識列的類型只能是數值型。it

  • 標識列能夠經過set auto_increment_increment =3;設置步長,也能夠經過手動插入值的方式設置標識列的起始值INSERT INTO student(id,name) VALUES (5,'xxx')table

相關文章
相關標籤/搜索