約束
約束保證數(shù)據(jù)的完整性和一致性瓜富,約束分為表級約束和列級約束。
表級約束和列級約束
有五種約束:
- NOT NULL 非空約束
- PRIMARY KEY 主鍵約束
- UNIQUE KEY 唯一約束
- DEFAULT 默認(rèn)約束
- FOREIGN KEY 外鍵約束
前四種約束,我們都已經(jīng)在第一篇里面介紹了。接下來講講外鍵約束
外鍵約束
-
要求:
- 父表和子表必須使用相同引擎,而且禁止使用臨時(shí)表
- 數(shù)據(jù)表的存儲引擎只能為InnoDB
- 外鍵列和參照列必須具有相似的數(shù)據(jù)類型栅干。其中數(shù)字的長度或是否有符號位必須相同;而字符的長度則可以不同
- 外鍵列和參照列必須創(chuàng)建索引捐祠。如果外鍵列不存在索引的話,MySql將自動(dòng)創(chuàng)建索引
ex:
CREATE TABLE provinces( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, pname VARCHAR(20) NOT NULL);
CREATE TABLE users( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid BIGINT, FOREIGN KEY (pid) REFERENCES provinces(id) );
-
外鍵約束的參照操作
- CASCADE:從父表中刪除或更新自動(dòng)刪除或者更新子表中的外鍵行
- SET NULL:從父表刪除或者更新行桑李,并設(shè)置子表中的外鍵列
- RESTRICT:拒絕對父表的刪除或者更新操作
- NO ACTION:標(biāo)準(zhǔn)的SQL的關(guān)鍵字踱蛀,在MySQL中于RESTRICT相同
ex:
CREATE TABLE users1( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE);
MySql默認(rèn)引擎的配置
default-storage-engine=INNODB
修改數(shù)據(jù)表
格式如下:
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
ALTER
- 添加多列
ALTER TABLE tbl_name ADD [COLUMN] col_name col_definition
- 刪除列
ALTER TABLE tbl_name DROP [COLUMN] col_name
同時(shí)操作
操作用逗號分開,新增贵白,刪除操作可以同步進(jìn)行 - 添加主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name)
ALTER TABLE tbl_name DROP PRIMARY KEY//刪除主鍵
添加主鍵約束 - 添加唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIUQE [index_type] (index_col_name)
ALTER TABLE tbl_name DROP INDEX index_col_name //刪除唯一約束
- 添加外鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_type] (index_col_name) reference_definition
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol//刪除外鍵約束
外鍵約束 - 添加/刪除默認(rèn)約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
image.png - 修改列定義
ALTER TABLE tbl_name MODIFY [COLUMN] col_name col_definition [FIRST | AFTER col_name]
修改列定義 - 修改列名稱
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name col_definition [FIRST | AFTER col_name]
比modify操作多了一個(gè)可以更改數(shù)據(jù)列的名稱 - 數(shù)據(jù)表更名
ALTER TABLE tbl_name RENAME [TO | AS ] new_tbl_name
RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new tbl_name2]...