MySQL(2)-約束的新增及刪除
阿新 • • 發佈:2019-02-07
約束條件基本介紹:
約束:
1) 約束保證資料的完整性和一致性
2) 約束分為表級約束和列級約束
列級約束:約束只針對一個欄位來使用
表級約束:約束針對兩個及兩個以上欄位來使用
3) 約束型別包括:
- 主鍵約束(PRIMARY KEY)
- 唯一約束(UNIQUE KEY)
- 預設約束(DEFAULT)
- 非空約束(NOT NULL)
- 外來鍵約束(FOREIGN KEY)(目前僅InnoDB引擎型別支援外來鍵)
各種約束基本用法:
/*************************主鍵PRIMARY KEY***************************/
1) 每張資料表只能存在一個主鍵
2) 主鍵保證記錄的唯一性
3) 主鍵自動為NOT NULL
CREATE TABLE tb3(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL
);
ps:AUTO_INCREMENT一定和主鍵PRIMARY KEY一起使用,但主鍵不一定要和AUTO_INCREMENT一起使用,當插入資料時自增,但是若插入失敗也會有自增,那麼如何防範?答案如下:
ALTER TABLE [表名] MODIFY [列] [新屬性1] [新屬性2]..;
例如:ALTER TABLE id FROM tb3 MODIFY id SMALLINT UNSIGNED AUTO_INCREMENT;
/*注意*/:主鍵在建立的同時會自動建立索引
/*************************唯一約束UNIQUE KEY************************/
1) 唯一約束可以保證記錄的唯一性
2) 唯一約束的欄位可以為空值(NULL)
3) 每張資料表可以存在多個唯一約束
CREATE TABLE tb5(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR (30) NOT NULL UNIQUE KEY,
age TINYINT UNSIGNED
);//主鍵為id,唯一約束為username
/*************************預設約束DEFAULT***************************/
CREATE TABLE tb6(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL UNIQUE KEY,
sex ENUM('1', '2', '3') DEFAULT '3'
);//sex中如果為設定
/*************************外來鍵約束FOREIGN KEY***********************/
保持資料一致性,完整性
實現一對一或一對多關係
/*外來鍵約束的條件*/
1) 父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表。
2) 資料表的儲存引擎只能為InnoDB
3) 外來鍵列和參照列必須具有相似的資料型別,其中數字的長度或是否有符號位必須相同,而字元長度可不同
4) 外來鍵列和參照列必須建立索引,如果外來鍵列不存在索引,MySQL將自動建立索引
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 SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces (id)
);
/*外來鍵約束的參照操作*/
1)CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行
2)SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL.如果使用該選項,必須保證子表列沒有指定NOT NULL
3)RESTRICT
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;
);//最後一行屬性ON DELETE CASCADE代表若父表刪除或更新 則子表中匹配的行也被刪除或更新
/*檢視mysql當前預設儲存引擎*/
SHOW VARIABLES LIKE '%storage_engine%';
/*檢視某個表用的引擎(顯示結果中engine後面的值為儲存引擎)*/
SHOW CREATE TABLE [表名];
/*修改表的儲存引擎*/
ALTER TABLE [表名] ENGINE = INNODB;
/*修改預設儲存引擎*/
在/etc/my.cnf中加入default-storage-engine=INNODB即可(調整關閉需重啟mysql)
ps:如果之前建立的所有資料庫表為MyISAM,現在要更改資料庫引擎,一般需要一個表一個表的修改,比較繁瑣,可以採用先把資料庫匯出,得到SQL,把MyISAM修改成INNODB,再匯入的方式
各種約束的新增刪除操作:
/*新增/刪除主鍵約束*/
新增:
ALTER TABLE [表名] ADD [CONSTRAINT [給主鍵約束起的名字]] PRIMARY KEY (要新增主鍵約束的屬性名);//最後一個屬性必須帶括號,CONSTRAINT語句可以不用
刪除:
ALTER TABLE [表名] DROP PRIMARY KEY;
/*新增/刪除唯一約束*/
新增:
ALTER TABLE [表名] ADD [CONSTRAINT [給唯一約束起的名字]] UNIQUE (要新增唯一約束的屬性名);//每個表中主鍵約束只能新增一個,而唯一約束款可以新增多個
刪除:
ALTER TABLE [表名] DROP {INDEX | KEY} [屬性名];
/*新增/刪除外來鍵約束*/
新增:
ALTER TABLE [子表名] ADD [CONSTRAINT [給唯一約束起的名字]] FOREIGN KEY (新增外來鍵約束的屬性名) REFERENCES [父表名] (父表屬性);
刪除:
ALTER TABLE [表名] DROP FOREIGN KEY [外來鍵名];//一般為外來鍵約束中CONSTRAINT命名的名稱,不命名的話系統會自動命名,可以通過SHOW CREATE TABLE [表名];檢視外來鍵約束名稱,在CONSTRAINT之後
/*新增/刪除預設約束*/
新增:
ALTER TABLE [表名] ALTER [COLUMN] [屬性名] SET DEFAULT [預設值];
刪除:
ALTER TABLE [表名] ALTER [COLUMN] [屬性名] DROP DEFAULT;
ps:以上新增刪除均可用SHOW INDEXES FROM [表名];來檢視其對應約束
還需注意的是:
主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵
主鍵列不允許為NULL,而唯一性索引列允許NULL非空約束、預設約束:只能存在列級約束
主鍵約束、唯一約束、外來鍵約束:既可以存在於列級約束,也可以存在於表級約束