1. 程式人生 > >MySQL(2)-約束的新增及刪除

MySQL(2)-約束的新增及刪除

約束條件基本介紹:

約束:
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 3RESTRICT 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

非空約束、預設約束:只能存在列級約束
主鍵約束、唯一約束、外來鍵約束:既可以存在於列級約束,也可以存在於表級約束