約束
主鍵約束
主鍵,又稱主碼,是表中一列或多列的組合。主鍵約束(Primary Key Constraint)要求主鍵列的資料唯一,並且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外來鍵來定義不同資料表之間的關係,並且可以加快資料庫查詢速度。
主鍵分為兩種型別:
單欄位主鍵
在定義列的同時指定主鍵:
欄位名 資料型別 primary key
在定義完所有列之後指定主鍵:constraint <約束名> primary key [欄位名]
多欄位聯合主鍵
多欄位聯合主鍵語法如下:
primary key [欄位1,欄位2,...欄位n]
例如:primary key(id,name)
外來鍵約束
外來鍵用來在兩個表的資料之間建立連結,它可以是一列或者多列。一個表可以有一個或者多個外來鍵。一個表的外來鍵可以為空值,若不為空值,則每一個外來鍵值必須等於另一個表中的主鍵的某個值。
外來鍵:首先它是表中的一個欄位,它可以不是本表的主鍵,但對應另一個表的主鍵。外來鍵的作用是保持資料的一致性、完整性。
主表:對於兩個具有關聯的表而言,相關聯欄位中主鍵所在的那個表即是主表。
從表:對於兩個具有關聯的表而言,相關聯欄位中外來鍵所在的那個表即是從表。
建立外來鍵的語法規則如下:
constraint <外來鍵名> foreign key [欄位1,欄位2,....欄位n] references <主表名> [主鍵列1,主鍵列2,...主鍵列n]
例如:constraint test foreign key(name) references table_1(id);
從表的外來鍵必須關聯主表的主鍵,且關聯欄位的資料型別必須一致
非空約束
非空約束指欄位的值不能為空。對於使用了非空約束的欄位,如果使用者在新增資料時未指定值,資料庫系統會報錯。
非空約束語法規則如下:
欄位名 資料型別 not null
唯一約束
唯一性約束,要求該列唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複的值。
唯一性約束語法規則如下:
定義完列之後直接指定唯一性約束
欄位名 資料型別 unique
定義完所有列之後指定唯一性約束
constraint <約束名> unique [欄位名]
例如:constraint test unique(id)
unique
和primary key
的區別:一個表中可以有多個欄位宣告為unique
,但只能有一個primary key
宣告;宣告為primary key
的列不允許有空值,但宣告為unique
的欄位允許空值的存在。
預設約束
預設約束,指定某列的預設值。如男性員工比較多,性別就可以預設為“男”,如果插入一條新的記錄時沒有給這個欄位賦值,那麼系統就會自動為這個欄位賦值為“男”。
預設約束的語法規則如下:
欄位名 資料型別 default
例如:sex varchar(25) default man ;
設定表的屬性值自動增加
在資料庫應用中,經常希望在每次插入新紀錄時,系統自動生成欄位的主鍵值。通過auto_increment
,一個表只能有一個欄位使用auto_increment
約束,且該欄位必須為主鍵的一部分。auto_increment
約束的欄位可以是任何整數型別。
設定表的屬性值自動增加的語法規則如下:
欄位名 資料型別 auto_increment
資料表結構的操作
檢視
檢視錶基本結構語句
describe/desc語句可以檢視錶的欄位資訊,其中包括:欄位名、欄位資料型別、是否為主鍵,是否有預設值等。
語法規則如下:
describe 表名
==desc 表名
例:
mysql> describe user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
檢視錶的詳細結構
show create table
語句可以用來顯示建立表時的create table
語句,語法格式如下:
show create table 表名\G;
例:
mysql> show create table user\G;
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
修改資料表
修改表名
語法規則如下:
alter table 舊錶名 rename 新表名
修改表名不影響建立表時的資料結構。
修改欄位資料型別
語法規則如下:
alter table 表名 modify 欄位名 [資料型別]
例:
alter table test modify name varchar(30);
修改欄位名
語法規則如下:
alter table 表名 change 舊欄位名 新欄位名 [新資料型別]
例:
alter table test change name user_name varchar(30);
新增欄位
語法規則如下:
alter table 表名 add 新欄位名 [資料型別] [約束條件] [first|after 已存在欄位名] ;
例:
alter table test add id int(11) first;
在表的第一列新增一個id欄位。
alter table test add id int(11) after name;
在表的name列下新增一個id欄位。
刪除欄位
語法規則如下:
alter table 表名 drop 欄位名
修改欄位的排列位置
語法規則如下:
alter table 表名 modify 欄位1 [資料型別] first|after 欄位2;
例:
alter table test modify id varchar(12) first;
將id欄位調整到表中的第一列
alter table test modify id varchar(12) after name
將id欄位調整到表中name欄位後
更改表的儲存引擎
可以使用show engines
來檢視MySQL支援的儲存引擎。
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
更改表的儲存引擎的語法格式如下:
alter table 表名 engine=更改後的儲存引擎名
例:
alter table test engine=MyISAM;
刪除表的外來鍵約束
語法規則如下:
alter table 表名 drop foreign key 外來鍵約束名
刪除資料表
drop table [if exists] 表1,表2...,表n;
引數if exists
用於在刪除前判斷刪除的表是否存在,加上改引數後,再刪除表的時候,如果表不存在,SQL語句中可以順利執行,但會發出警告。需要注意的是:當資料表中存在外來鍵關聯的情況下,直接刪除主表會顯示刪除失敗,需要先接觸外來鍵約束條件