日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL学习笔记 约束以及修改数据表

發布時間:2025/3/21 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL学习笔记 约束以及修改数据表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

*** 約束保證數據的完整性和一致性

*** 約束分為表級約束和列級約束

*** 約束類型包括:

NOT NULL(非空約束)

PRIMARY KEY(主鍵約束)

UNIQUE KEY(唯一約束)

DEFAULT(默認約束)

FOREIGN KEY(外鍵約束)


1.外鍵約束的要求解析


*** 父表和子表必須使用相同的存儲引擎,而且禁止使用臨時表。

*** 數據表的存儲引擎只能為InnoDB。

*** 外鍵列和參照列必須具有相似的數據類型。其中數字的長度或是否有符號位必須相同;而字符的長度則可以不同。

?????? 主鍵是默認自帶索引的? 而外鍵列創建時一般參照的是帶有主鍵那一列? 因此如果外鍵列沒有創建索引的話就會被MYSQL根據參照列的索引創建一個索引??

*** 外鍵列是不可以以一個沒有索引的列作為參照列的

1.參照列必須要創建一個索引(如果用的是主鍵默認自帶索引? 所以不用創建)??

2.外鍵列隨意? 如果不創建索引會被創建

【1】編輯數據表的默認存儲引擎,配置文件/etc/my.cnf

1 2 [mysqld] default-storage-engine=INNODB

【2】 創建省份數據表,查看存儲引擎

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql>?USE?test; mysql>?CREATE?TABLE?provinces( ????->?id?SMALLINT?UNSIGNED?PRIMARY?KEY?AUTO_INCREMENT, ????->?pname?VARCHAR(20)?NOT?NULL ????->?); mysql>?SHOW?CREATE?TABLE?provinces; +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |?Table?|?Create?Table????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |?tb0???|?CREATE?TABLE?`provinces`?( ??`id`?smallint(5)?unsigned?NOT?NULL?AUTO_INCREMENT, ??`pname`?varchar(20)?NOT?NULL, ??PRIMARY?KEY?(`id`) )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?| +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+

【3】創建用戶數據表,其中外鍵列必須和參照列必須有相似的數據類型

1 2 3 4 5 6 mysql>?CREATE?TABLE?users( ????->?id?SMALLINT?UNSIGNED?PRIMARY?KEY?AUTO_INCREMENT, ????->?username?VARCHAR(10)?NOT?NULL, ????->?pid?SMALLINT?UNSIGNED, ????->?FOREIGN?KEY?(pid)?REFERENCES?provinces?(id) ????->?);
  • 注意:其中有外鍵列的users表為子表,有參照列id列provinces為父表

  • 創建主鍵時自動創建索引,查看父表自動創建的1個索引

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 mysql>?SHOW?INDEXES?FROM?provinces\G; ***************************?1.?row?*************************** ???????Table:?provinces ??Non_unique:?0 ????Key_name:?PRIMARY Seq_in_index:?1 ?Column_name:?id ???Collation:?A ?Cardinality:?0 ????Sub_part:?NULL ??????Packed:?NULL ????????Null:? ??Index_type:?BTREE ?????Comment:? 1?row?in?set?(0.00?sec) ERROR:? No?query?specified
  • 若外鍵列沒有索引,自動創建:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 mysql>?SHOW?INDEXES?FROM?users\G;???? ***************************?1.?row?*************************** ???????Table:?users ??Non_unique:?0 ????Key_name:?PRIMARY Seq_in_index:?1 ?Column_name:?id ???Collation:?A ?Cardinality:?0 ????Sub_part:?NULL ??????Packed:?NULL ????????Null:? ??Index_type:?BTREE ?????Comment:? ***************************?2.?row?*************************** ???????Table:?users ??Non_unique:?1 ????Key_name:?pid Seq_in_index:?1 ?Column_name:?pid ???Collation:?A ?Cardinality:?0 ????Sub_part:?NULL ??????Packed:?NULL ????????Null:?YES ??Index_type:?BTREE ?????Comment:? 2?rows?in?set?(0.00?sec) ERROR:? No?query?specified

2.外鍵約束的參照操作

*** cascade :從父表刪除或更新且自動刪除或更新子表中匹配的行

*** set null :從父表刪除或更新行,并設置子表中的外鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL

*** restrict :拒絕對父表的刪除或更新操作

*** no action :標準的SQL的關鍵詞,在MySQL中與restrict相同

CASCADE例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 mysql>?CREATE?TABLE?provinces( ????->?id?SMALLINT?UNSIGNED?PRIMARY?KEY?AUTO_INCREMENT, ????->?pname?VARCHAR(20)?NOT?NULL ????->?); 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 ????->?); mysql>?INSERT?provinces(pname)?VALUES('Tom'); mysql>?INSERT?provinces(pname)?VALUES('John'); mysql>?INSERT?provinces(pname)?VALUES('Driver'); mysql>?INSERT?users1(username,pid)?VALUES('Huang',2); mysql>?INSERT?users1(username,pid)?VALUES('Li',3); mysql>?INSERT?users1(username,pid)?VALUES('Pan',3); mysql>?INSERT?users1(username,pid)?VALUES('He',1);? mysql>?INSERT?users1(username,pid)?VALUES('Long',2); mysql>?SELECT?*?FROM?users1; +----+----------+------+ |?id?|?username?|?pid??| +----+----------+------+ |??1?|?Huang????|????2?| |??2?|?Li???????|????3?| |??5?|?Pan??????|????3?| |??6?|?He???????|????1?| |??7?|?Long?????|????2?| +----+----------+------+ mysql>?SELECT?*?FROM?provinces;?????????????? +----+--------+ |?id?|?pname??| +----+--------+ |??1?|?Tom????| |??2?|?John???| |??3?|?Driver?| +----+--------+ mysql>?DELETE?FROM?provinces?WHERE?id=3; mysql>?SELECT?*?FROM?provinces; +----+-------+ |?id?|?pname?| +----+-------+ |??1?|?Tom???| |??2?|?John??| +----+-------+ mysql>?SELECT?*?FROM?users1;??????????? +----+----------+------+ |?id?|?username?|?pid??| +----+----------+------+ |??1?|?Huang????|????2?| |??6?|?He???????|????1?| |??7?|?Long?????|????2?| +----+----------+------+

3.表級約束和列級約束

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

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

*** 列級約束既可以在列定義時聲明,也可以在列定義后聲明

*** 表級約束只能在列定以后聲明

4.修改數據表

添加單列

1 ALTER?TABLE?tbl_name?ADD?[COLUMN]?col_name?column_definition?[FIRST|AFTER?col_name]

????????

  • 例:

1 2 3 4 5 6 7 8 mysql>?SHOW?COLUMNS?FROM?users1; +----------+----------------------+------+-----+---------+----------------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra??????????| +----------+----------------------+------+-----+---------+----------------+ |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?NULL????|?auto_increment?| |?username?|?varchar(10)??????????|?NO???|?????|?NULL????|????????????????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|????????????????| +----------+----------------------+------+-----+---------+----------------+

????

  • 添加age列到最后一列:

1 2 3 4 5 6 7 8 9 10 mysql>?ALTER?TABLE?users1?ADD?age?TINYINT?UNSIGNED?NOT?NULL?DEFAULT?10; ????mysql>?SHOW?COLUMNS?FROM?users1;??????????????????????????????????????? +----------+----------------------+------+-----+---------+----------------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra??????????| +----------+----------------------+------+-----+---------+----------------+ |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?NULL????|?auto_increment?| |?username?|?varchar(10)??????????|?NO???|?????|?NULL????|????????????????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|????????????????| |?age??????|?tinyint(3)?unsigned??|?NO???|?????|?10??????|????????????????| +----------+----------------------+------+-----+---------+----------------+

????????

  • 添加password列到username列的后面:

1 2 3 4 5 6 7 8 9 10 11 mysql>?ALTER?TABLE?users1?ADD?password?VARCHAR(32)?NOT?NULL?AFTER?username;? mysql>?SHOW?COLUMNS?FROM?users1;??????????????????????????????????????????? +----------+----------------------+------+-----+---------+----------------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra??????????| +----------+----------------------+------+-----+---------+----------------+ |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?NULL????|?auto_increment?| |?username?|?varchar(10)??????????|?NO???|?????|?NULL????|????????????????| |?password?|?varchar(32)??????????|?NO???|?????|?NULL????|????????????????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|????????????????| |?age??????|?tinyint(3)?unsigned??|?NO???|?????|?10??????|????????????????| +----------+----------------------+------+-----+---------+----------------+
  • 添加truename列到第一列:

1 2 3 4 5 6 7 8 9 10 11 12 mysql>?ALTER?TABLE?users1?ADD?truename?VARCHAR(32)?NOT?NULL?FIRST; mysql>?SHOW?COLUMNS?FROM?users1;??????????????????????????????????????????? +----------+----------------------+------+-----+---------+----------------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra??????????| +----------+----------------------+------+-----+---------+----------------+ |?truename?|?varchar(32)??????????|?NO???|?????|?NULL????|????????????????| |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?NULL????|?auto_increment?| |?username?|?varchar(10)??????????|?NO???|?????|?NULL????|????????????????| |?password?|?varchar(32)??????????|?NO???|?????|?NULL????|????????????????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|????????????????| |?age??????|?tinyint(3)?unsigned??|?NO???|?????|?10??????|????????????????| +----------+----------------------+------+-----+---------+----------------+

????刪除列:

1 ALTER?TABLE?tbl_name(數據表名稱)?DROP?[COLUMN]?col_name(列名)

????

  • 例,刪除truename列:

1 2 3 4 5 6 7 8 9 10 11 mysql>?ALTER?TABLE?users1?DROP?truename; mysql>?SHOW?COLUMNS?FROM?users1;???????? +----------+----------------------+------+-----+---------+----------------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra??????????| +----------+----------------------+------+-----+---------+----------------+ |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?NULL????|?auto_increment?| |?username?|?varchar(10)??????????|?NO???|?????|?NULL????|????????????????| |?password?|?varchar(32)??????????|?NO???|?????|?NULL????|????????????????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|????????????????| |?age??????|?tinyint(3)?unsigned??|?NO???|?????|?10??????|????????????????| +----------+----------------------+------+-----+---------+----------------+

同時刪除age和password列,(也可同時增加刪除)用逗號分割:

1 2 3 4 5 6 7 8 9 mysql>?ALTER?TABLE?users1?DROP?age,DROP?password; mysql>?SHOW?COLUMNS?FROM?users1;????????????????? +----------+----------------------+------+-----+---------+----------------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra??????????| +----------+----------------------+------+-----+---------+----------------+ |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?NULL????|?auto_increment?| |?username?|?varchar(10)??????????|?NO???|?????|?NULL????|????????????????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|????????????????| +----------+----------------------+------+-----+---------+----------------+

????添加 / 刪除主鍵約束:

1 2 3 ALTER?TABLE?tbl_name?ADD?[CONSTRAINT?[symbol]]?PRIMARY?KEY?[index_type]?(index_col_name,...)???????//添加 ALTER?TABLE?tbl_name?DROP?PRIMARY?KEY?????//刪除

????添加 / 刪除唯一約束:

1 2 3 ALTER?TABLE?tbl_name?ADD?[CONSTRAINT?[symbol]]?UNIQUE?[INDEX|KEY]?[index_name]?[index_type]?(index_col_name,...)????//添加 ALTER?TABLE?tbl_name?DROP?{INDEX|KEY}?index_name???//刪除

????添加 / 刪除外鍵約束:

1 2 3 ALTER?TABLE?tbl_name?ADD?[CONSTRAINT?[symbol]]?FOREIGN?KEY?[index_name]?(index_col_name,...)?reference_definition????//添加 ALTER?TABLE?tbl_name?DROP?FOREIGN?KEY?fk_symbol???//刪除

????添加 / 刪除默認約束:

1 2 ALTER?TABLE?tbl_name?ALTER?[COLUMN]?col_name?{SET?DEFAULT?literal|DROP?DEFAULT}????//添加 mysql>?ALTER?TABLE?tbl_name?ALTER?age?DROP?DEFAULT;????//刪除

????????????

添加主鍵約束:創建users2數據表,增加id列,設置id列為主鍵:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 mysql>?CREATE?TABLE?users2( ???->?username?VARCHAR(20)?NOT?NULL, ???->?pid?SMALLINT?UNSIGNED ???->?);???? mysql>?ALTER?TABLE?users2?ADD?id?SMALLINT?UNSIGNED; mysql>?ALTER?TABLE?users2?ADD?CONSTRAINT?pk_users2_id?PRIMARY?KEY?(id); mysql>?SHOW?COLUMNS?FROM?users2; +----------+----------------------+------+-----+---------+-------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra?| +----------+----------------------+------+-----+---------+-------+ |?username?|?varchar(20)??????????|?NO???|?????|?NULL????|???????| |?pid??????|?smallint(5)?unsigned?|?YES??|?????|?NULL????|???????| |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?0???????|???????| +----------+----------------------+------+-----+---------+-------+

??????????

  • ?刪除主鍵約束:

1 mysql>?ALTER?TABLE?users2?DROP?PRIMARY?KEY;

????????添加唯一約束:添加username列為唯一約束:

1 mysql>?ALTER?TABLE?users2?ADD?CONSTRAINT?OK_users2_username?UNIQUE?KEY?(username);

????????

  • 刪除唯一約束:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 mysql>?SHOW?INDEXES?FROM?users2\G; ***************************?1.?row?*************************** ???????Table:?users2 ??Non_unique:?0 ????Key_name:?OK_users2_username Seq_in_index:?1 ?Column_name:?username ???Collation:?A ?Cardinality:?0 ????Sub_part:?NULL ??????Packed:?NULL ????????Null:? ??Index_type:?BTREE ?????Comment:? ***************************?2.?row?*************************** ???????Table:?users2 ??Non_unique:?1 ????Key_name:?pid Seq_in_index:?1 ?Column_name:?pid ???Collation:?A ?Cardinality:?0 ????Sub_part:?NULL ??????Packed:?NULL ????????Null:?YES ??Index_type:?BTREE ?????Comment:? 2?rows?in?set?(0.00?sec) ERROR:? No?query?specified mysql>?ALTER?TABLE?users2?DROP?INDEX?OK_users2_username; mysql>?SHOW?INDEXES?FROM?users2\G;?????????????????????? ***************************?1.?row?*************************** ???????Table:?users2 ??Non_unique:?1 ????Key_name:?pid Seq_in_index:?1 ?Column_name:?pid ???Collation:?A ?Cardinality:?0 ????Sub_part:?NULL ??????Packed:?NULL ????????Null:?YES ??Index_type:?BTREE ?????Comment:? 1?row?in?set?(0.00?sec)

????????????

  • 添加外鍵約束:添加pid列為外鍵列,provincse數據表中的id為參照列:

1 mysql>?ALTER?TABLE?users2?ADD?FOREIGN?KEY?(pid)?REFERENCES?provinces?(id);

????????

  • 刪除外鍵約束:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql>?SHOW?CREATE?TABLE?users2;? +--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |?Table??|?Create?Table??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| +--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |?users2?|?CREATE?TABLE?`users2`?( ??`username`?varchar(20)?NOT?NULL, ??`pid`?smallint(5)?unsigned?DEFAULT?NULL, ??`id`?smallint(5)?unsigned?NOT?NULL?DEFAULT?'0', ??`age`?tinyint(4)?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;
  • 添加默認約束:添加age列,設置age列默認15

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 mysql>?ALTER?TABLE?users2?ADD?age?TINYINT?NOT?NULL; mysql>?SHOW?COLUMNS?FROM?users2;? +----------+----------------------+------+-----+---------+-------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra?| +----------+----------------------+------+-----+---------+-------+ |?username?|?varchar(20)??????????|?NO???|?UNI?|?NULL????|???????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|???????| |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?0???????|???????| |?age??????|?tinyint(4)???????????|?NO???|?????|?NULL????|???????| +----------+----------------------+------+-----+---------+-------+ mysql>?ALTER?TABLE?users2?ALTER?age?SET?DEFAULT?15;? mysql>?SHOW?COLUMNS?FROM?users2;??????????????????? +----------+----------------------+------+-----+---------+-------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra?| +----------+----------------------+------+-----+---------+-------+ |?username?|?varchar(20)??????????|?NO???|?UNI?|?NULL????|???????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|???????| |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?0???????|???????| |?age??????|?tinyint(4)???????????|?NO???|?????|?15??????|???????| +----------+----------------------+------+-----+---------+-------+

????????

  • 刪除默認值:

1 2 3 4 5 6 7 8 9 10 mysql>?ALTER?TABLE?users2?ALTER?age?DROP?DEFAULT; mysql>?SHOW?COLUMNS?FROM?users2;??????????????????? +----------+----------------------+------+-----+---------+-------+ |?Field????|?Type?????????????????|?Null?|?Key?|?Default?|?Extra?| +----------+----------------------+------+-----+---------+-------+ |?username?|?varchar(20)??????????|?NO???|?UNI?|?NULL????|???????| |?pid??????|?smallint(5)?unsigned?|?YES??|?MUL?|?NULL????|???????| |?id???????|?smallint(5)?unsigned?|?NO???|?PRI?|?0???????|???????| |?age??????|?tinyint(4)???????????|?NO???|?????|?NULL????|???????| +----------+----------------------+------+-----+---------+-------+

????????????修改列定義:

1 ALTER?TABLE?tbl_name?MODIFY?[COLUMN]?col_name?column_definition?[FIRST|AFTER?col_name]

????????????修改列名稱(不能隨便更改):

1 ALTER?TABLE?tbl_name?CHANGE?[COLUMN]?old_col_name?new_col_name?column_dufinition?[FIRST|AFTER?col_name]

????????????修改數據表名字(不能隨便更改):

????????????????

  • 方法一:

1 ALTER?TABLE?old_tbl_name?RENAME?new_tbl_name

???? ??方法二:

1 RENAME?TABLE?old_tbl_name?TO?new_tbl_name?[,tbl_name2?TO?new_tbl_name2]...




? ? ? 本文轉自謝育政 51CTO博客,原文鏈接:http://blog.51cto.com/kurolz/1876254,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的MySQL学习笔记 约束以及修改数据表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。