1. 程式人生 > 實用技巧 >mysql學習筆記(二)

mysql學習筆記(二)

此學習筆記根據慕課網課程“與MYSQL的零距離接觸”學習總結

3.約束以及修改資料表

3-1 外來鍵約束的要求解析

外來鍵約束:保證資料一致性、完整性,實現一對一或一對多關係。

FOREIGN KEY (外來鍵列名稱) REFERENCES 父表(參照列名稱);

外來鍵約束的要求:

  1. 父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表
  2. 資料表的儲存引擎只能為InnoDB。
  3. 外來鍵列和參照列必須具有相似的資料型別。其中數字的長度或是否有符號位必須相同;而字元的長度則可以不同。
  4. 外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,MySQL將自動建立索引。
顯示索引:SHOW INDEXES FROM 表名;
    或者:SHOW INDEXES FROM 表名\G;(以網格的形式來呈現)
刪除索引:ALEER TABLE tbl_name DROP INDEX 索引名稱;

3-2 外來鍵約束的參照操作

1.CASCADE 從父表刪除或更新且自動刪除或更新子表中匹配的行

2.SET NULL
從父表刪除或更新行,並設定子表中的外來鍵列為NULL。如果使用該選項,必須保證子列表沒有指定NOT NULL

3.RESTRICT 拒絕對父表的刪除或更新操作

4.NO ACTION 標準SQL的關鍵字,在MySQL中與RESTRICT相同。

語法結構:FOREIGN KEY (外來鍵列名稱) REFERENCES 父表(參照列名稱) ON DELETE CASCADE;

mysql> 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
-> );
Query OK, 0 rows affected (0.53 sec)

3-3 表級約束與列級約束

對一個數據列建立的約束,稱為列級約束。

對多個數據列建立的約束,稱為表級約束。

列級約束既可以在列定義時宣告,也可以在定義後宣告。

表級約束只能在列定義後宣告。

3-4 新增/刪除列

新增單列:

ALTER TABLE tbl_name ADD col_name column_definition FIRST | AFTER col_name;
ALTER TABLE 表名稱 ADD 列名稱 列定義 FIRST | AFTER 列名稱;

FIRST將新新增的這一列置於所有列最前面

AFTER col_name 將新新增的列置於你指定列的後方

如果省略FIRST | AFTER col_name,則置於所有列之後

新增多列:

ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,
                                   ……
                                  );

新增多列時不能指定位置關係,只能在原來資料列的下方。


刪除單列:

ALTER TABLE tbl_name DROP col_name;

刪除多列:

ALTER TABLE tbl_name DROP col_name1,DROP col_name2;

3-5 新增/刪除約束 (注:col_name:列名稱)

新增/刪除主鍵約束:

ALTER TABLE tbl_name ADD PRIMARY KEY (col_name);
ALTER TABLE tbl_name DROP PRIMARY KEY;

新增/刪除唯一約束:

ALTER TABLE tbl_name ADD UNIQUE (col_name);
ALEER TABLE tbl_name DROP INDEX 索引名稱;  (也可以用於刪除其他索引)

新增/刪除外來鍵約束:

ALTER TABLE tbl_name ADD FOREIGN KEY (外來鍵列名稱) REFERENCES 父表(參照列名稱);
ALTER TABLE tbl_name DROP FOREIGN KEY 約束名稱; (外來鍵約束名稱通過SHOW CREATE TABLE tbl_name 檢視)

例如:| users2 | CREATE TABLE `users2` (
  `username` varchar(10) NOT NULL,
  `pid` smallint(5) unsigned DEFAULT NULL,
  `id` smallint(5) unsigned NOT NULL,
  `age` tinyint(3) unsigned NOT NULL,
  KEY `pid` (`pid`),
  CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
mysql> ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;

新增/刪除預設約束:

ALTER TABLE tbl_name ALTER col_name SET DEFAULT 預設值;
ALTER TABLE tbl_name ALTER col_name DROP DEFAULT;

3-6 修改列定義和更名資料表

修改列定義:

ALTER TABLE tbl_name MODIFY col_name column_definition FIEST | AFTER col_name;
ALTER TABLE 表名稱 MODIFY列名稱 列定義 FIRST | AFTER 列名稱;

修改列名稱:(除了修改列定義還可以修改列名稱)

ALTER TABLE tbl_name CHANGE old_col_name new_col_name column_definition FIRST | AFTER col_name;
ALTER TABLE tbl_name CHANGE 舊的列名稱 新的類名稱 列定義 FIRST | AFTER col_name;

資料表更名:

方法1:

ALTER TABLE tbl_name RENAME new_tbl_name;

方法2:

RENAME TABLE tbl_name TO new_tbl_name;

總結

約束:

按功能劃為NOT NULL(非空約束)
PRIMARY KEY(主鍵約束)
UNIQUE KEY(唯一約束)
DEFAULT(預設約束)
FOREIGN KEY(外來鍵約束)
按資料列的數目劃為表級約束
列級約束

修改資料表:

針對欄位的操作:新增/刪除欄位、修改列定義、修改列名稱等

針對約束的操作:新增/刪除各種約束

針對資料表的操作:資料表更名(兩種方式)


未完待續。。。