1.創建數據表
在創建完數據庫之後,接下來我們就需要創建數據表。創建數據表是指在已經創建好的數據庫中建立新表。創
建數據表的過程是規定數據列的屬性的過程,同時也是實施數據完整性約束的過程。
2.創建表的語法形式
數據表屬於數據庫,在創建數據表之前,應該使用語句“USE <數據庫名>” 指定操作是從哪個數據庫中進行,如
果沒有選擇數據庫,會報錯
語法:
CREATE TABLE <表名> ( 字段名1, 數據類型 [列級別約束條件] [默認值], 字段名2, 數據類型 [列級
別約束條件] [默認值], ... ... ):
例如:
mysql> CREATE TABLE tb_emp1
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| tb_emp1 |
+----------------+
1 row in set (0.05 sec)
1.1.使用主鍵約束
主鍵約束要求主鍵列的數據唯一,並且不允許爲空。
- 單字段主鍵
語法: 字段名 數據類型 PRIMARY KEY [默認值] 例如: mysql> CREATE TABLE tb_emp2 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptID INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.05 sec)
- 在定義完所有列之後指定主鍵
語法: [CONSTRAINT <約束名>] PRIMARY KEY [字段名] 例如: mysql> CREATE TABLE tb_emp3 -> ( -> id INT(11), -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> PRIMARY KEY(id) -> ); Query OK, 0 rows affected (0.01 sec)
- 多字段聯合主鍵
語法: PRIMARY KEY [字段1,字段2,....] 例如: mysql> CREATE TABLE tb_emp4 -> ( -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> PRIMARY KEY(name,deptId) -> ); Query OK, 0 rows affected (0.00 sec)
1.2.使用外鍵約束
外鍵用來在兩個表數據之間建立連接,它可以是一列或者多列語法: [CONSTRAINT<外鍵名>] FOREIGN KEY [字段名1,字段名2...] REFERENCES<主表名> 主鍵列1[主鍵列 2...] 例如: mysql> CREATE TABLE tb_dept1 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) NOT NULL, -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE tb_emp5 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id) -> ); Query OK, 0 rows affected (0.06 sec)
1.3. 使用非空約束
非空約束指字段的值不能爲空。語法: 字段名 數據類型 not null 例如: mysql> CREATE TABLE tb_emp6 -> ( -> id INT(11) PRIMARY KEY , -> name VARCHAR(25) NOT NULL, -> deptId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.06 sec)
或者 語法: [CONSTRATIN <約束名>] UNIQUE (<字段名>) 例如: mysql> CREATE TABLE tb_dept3 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22), -> location VARCHAR(50), -> CONSTRAINT STH UNIQUE(name) -> ); Query OK, 0 rows affected (0.00 sec)
1.4.使用默認約束
默認約束指定某列的默認值。語法: 字段名 數據類型 DEFAULT 默認值 例如: mysql> CREATE TABLE tb_emp7 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25) NOT NULL, -> deptId INT(11) DEFAULT 1111, -> salary FLOAT, -> info VARCHAR(50) -> ); Query OK, 0 rows affected (0.00 sec)
1.5.設置表的屬性值自動增加
語法: 字段名 數據類型 AUTO_INCREMENT 例如: mysql> CREATE TABLE tb_emp8 -> ( -> id INT(11) PRIMARY KEY AUTO_INCREMENT, -> name VARCHAR(25) NOT NULL, -> deptId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.00 sec)
插入數據驗證:
mysql> INSERT INTO tb_emp8(name,salary) -> VALUES('lucy',1000),('lura',1200),('kevin',1500); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0
查看:
mysql> SELECT * FROM tb_emp8; +----+-------+--------+--------+ | id | name | deptId | salary | +----+-------+--------+--------+ | 1 | lucy | NULL | 1000 | | 2 | lura | NULL | 1200 | | 3 | kevin | NULL | 1500 | +----+-------+--------+--------+ 3 rows in set (0.00 sec)
3.查看數據表結構
3.1. 查看錶基本結構語句DESCRIBE語法: DESCRIBE 表名; 或 DESC 表名; 例如: mysql> DESCRIBE tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | NO | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
或者
mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | NO | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
3.2.查看錶詳細結構語句
語法: SHOW CREATE TABLE <表名\G> mysql> SHOW CREATE TABLE tb_emp1\G *************************** 1. row *************************** Table: tb_emp1 Create Table: CREATE TABLE `tb_emp1` ( `id` int(11) DEFAULT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
3.3. 修改數據表 3.3.1 修改表名
語法: ALTER TABLE <舊錶名> RENAME [TO] <新表名>. 例如: mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_dept3 | | tb_emp1 | | tb_emp2 | | tb_emp3 | | tb_emp4 | | tb_emp5 | | tb_emp7 | | tb_emp8 | +----------------+ 9 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept3 RENAME tb_deptment3; Query OK, 0 rows affected (0.05 sec)
mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_deptment3 | | tb_emp1 | | tb_emp2 | | tb_emp3 | | tb_emp4 | | tb_emp5 | | tb_emp7 | | tb_emp8 | +----------------+ 9 rows in set (0.00 sec)
3.4.修改字段的數據類型
語法: ALTER TABLE <表名> MODIFY <字段名> <數據類型> 例如: mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | NO | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 MODIFY name VARCHAR(30); Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
3. 5.修改字段名
語法: ALTER TABLE <表名> CHANGE<舊字段名><新字段名> <新數據類型> 例如: mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50); Query OK, 0 rows affected (0.10 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
3.6. 添加字段
語法: ALTER TABLE <表名> ADD <新字段名><數據類型> [約束條件] [FIRST|AFTER 已存在字段名] 例如: mysql> DESC tb_dept1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) not null; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +---------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
或者
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | column2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
或者
mysql> ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name ; Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | column2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +---------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
3.7.刪除字段
語法: ALTER TABLE <表名> DROP <字段名> 例如: mysql> ALTER TABLE tb_dept1 DROP column2; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
3.8.修改字段的排列位置
語法: ALTER TABLE <表名> MODIFY <字段名> <數據類型> FIRST | AFTER <字段2> 例如: mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | column1 | varchar(12) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.01 sec)
或者
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_dept1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
3.9.更改表的存儲引擎
語法: ALTER TABLE <表名> ENGINE=<更改後的存儲引擎> 例如: mysql> SHOW CREATE TABLE tb_deptment3\G *************************** 1. row *************************** Table: tb_deptment3 Create Table: CREATE TABLE `tb_deptment3` ( `id` int(11) NOT NULL, `name` varchar(22) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `STH` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE tb_deptment3\G *************************** 1. row *************************** Table: tb_deptment3 Create Table: CREATE TABLE `tb_deptment3` ( `id` int(11) NOT NULL, `name` varchar(22) DEFAULT NULL, `location` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `STH` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
3.10. 刪除表的外鍵約束
語法: ALTER TABLE <表名> DROP FOREIGN KEY <外鍵約束名> mysql> CREATE TABLE tb_emp9 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1(id) -> ); Query OK, 0 rows affected (0.04 sec)
mysql> SHOW CREATE TABLE tb_emp9\G *************************** 1. row *************************** Table: tb_emp9 Create Table: CREATE TABLE `tb_emp9` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptId`), CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
mysql> ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept; Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE tb_emp9\G *************************** 1. row *************************** Table: tb_emp9 Create Table: CREATE TABLE `tb_emp9` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_emp_dept` (`deptId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
4.刪除數據表
4.1. 刪除沒有被關聯的表語法: DROP TABLE [IF EXISTS]表1,表2... 例如:mysql> DROP TABLE IF EXISTS tb_dept2; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_deptment3 | | tb_emp1 | | tb_emp2 | | tb_emp3 | | tb_emp4 | | tb_emp5 | | tb_emp7 | | tb_emp8 | | tb_emp9 | +----------------+ 10 rows in set (0.00 sec)
4.2.刪除被其他表關聯的主表
先創建表tb_dept2 mysql> CREATE TABLE tb_dept2 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22), -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.08 sec)
創建表tb_emp mysql> CREATE TABLE tb_emp -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES tb_dept2(id) -> ); Query OK, 0 rows affected (0.09 sec)
直接刪除父表tb_dept2
mysql> DROP TABLE tb_dept2;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint
fails
可以看到在外鍵約束時,主表不能直接刪除。
mysql> ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
解除關聯子表tb_dept的外鍵約束
mysql> DROP TABLE tb_dept2;
Query OK, 0 rows affected (0.05 sec)
表就可以被刪除