您好,登錄后才能下訂單哦!
3.1、創建數據表
創建數據表指的是在已經創建好的數據庫中建立新表。創建數據表的過程是規定數據列的屬性的過程,同時也是實施數據完整性(實體完整性、引用完整性、域完整性)約束的過程。
創建表的語法格式
數據表屬于數據庫,在創建數據表之前,應該先創建數據庫,指定在哪個數據庫中進行。
mysql> USE test; Database changed mysql> CREATE TABLE tb_name ( 字段名1,數據類型 [列級別約束條件] [默認值], 字段名2,數據類型 [列級別約束條件] [默認值], ... [表級別約束條件] );
例如創建員工表tb_emp1,表結構為:
字段名稱 | 數據類型 | 備注 |
id | INT(11) | 員工編號 |
name | VARCHAR(25) | 員工名稱 |
deptId | INT(11) | 所在部門編號 |
salary | FLOAT | 工資 |
mysql> USE test; Database changed mysql> CREATE TABLE tb_emp1 -> ( -> id INT(11), -> name VARCHAR(25), -> depId 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.00 sec)
使用主鍵約束
主鍵,又稱主碼,是表中一列或多列的組合。主鍵約束要求主鍵列的數據唯一,并且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外鍵來定義不同數據表之間的關系,并且可以加快數據查詢的速度。主鍵分為單字段主鍵和多字段聯合主鍵。
單字段主鍵由一個字段組成,其語法格式有兩種:
字段名 數據類型 PRIMARY KEY [默認值] mysql> CREATE TABLE tb_emp2 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT -> );
[CONSTRAINT <約束名>] PRIMARY KEY [字段名] mysql> CREATE TABLE tb_emp3 -> ( -> id INT(11) , -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT, -> PRIMARY KEY(id) -> );
多字段聯合主鍵,即主鍵由多個字段組合,其語法格式為:
PRIMARY KEY [字段1,字段2,字段3,...] mysql> CREATE TABLE tb_emp4 -> ( -> name VARCHAR(25), -> depId INT(11), -> salary FLOAT -> PRIMARY KEY(name,depId) -> );
使用外鍵約束
外鍵用來在兩個表的數據之間建立鏈接,它可以是一列或多列。一個表可以有一個或多個外鍵。外鍵對應的是參照完整性,一個表的外鍵可以為空,當不為空時,則每一個外鍵值必須等于另一個表中主鍵的某個值。
外鍵:它是表中的一個字段,可以不是本表的主鍵,但對應另一個表的主鍵。外鍵主要作用是保證數據引用的完整性,定義外鍵后,不允許刪除在另一個表中具有關聯關系的行。例如:部門表tb_dept的主鍵是id,在員工表tb_emp5中有一個鍵depId與這個id關聯。
主表:對于兩個具有關聯關系的表而言,相關聯字段中主鍵所在的那個表即是主表。
從表:對于兩個具有關聯關系的表而言,相關聯字段中外鍵所在的那個表即是從表。
創建外鍵的語法規則:
[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名1 [,字段名2,...] REFERENCES <主表名> 主鍵列1 [,主鍵列2,...]
'外鍵名'為定義的外鍵約束的名稱,一個表中不能有相同的外鍵;'字段名'表示字表需要添加外鍵約束的字段列;'主表名'即被子表外鍵所依賴的表的名稱;'主鍵列'表示主表中定義的主鍵列。
例如:定義數據表tb_emp5,并在tb_emp5上創建外鍵約束。
創建一個部門表:
mysql> CREATE TABLE tb_dept1( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) NOT NULL, -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.02 sec)
定義數據表tb_emp5,讓它的鍵depId作為外鍵關聯到tb_dept1的主鍵id:
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.05 sec)
使用非空約束
非空約束指字段的值不能為空。對于使用非空約束的字段,如果在添加數據時沒有指定值,數據庫會報錯。
非空約束的語法規則:
字段名 數據類型 NOT NULLL mysql> CREATE TABLE tb_emp6( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25) NOT NULL, -> depId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.03 sec)
使用唯一性約束
唯一性約束要求該列唯一,允許為空,但只能出現一個空值。唯一性約束可以確保一列或幾列不出現重復值。
唯一性約束的語法規則有:
1、定義完列之直接指定唯一約束
字段名 數據類型 UNIQUE mysql> CREATE TABLE tb_dept2( -> id INT(11) PRIMARY KEY, -> name VARCHAR(22) UNIQUE, -> location VARCHAR(50) -> ); Query OK, 0 rows affected (0.20 sec)
2、定義完所有列之后指定唯一約束
[CONSTRAINT <約束名>] 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.03 sec)
UNIQUE和PRIMARY KEY的區別:一個表可以有多個字段聲明為UNIQUE,但是只能有一個PRIMARY KEY聲明,聲明為PRIMARY KEY的列不允許有空值,但是聲明為UNIQUE的字段允許空值(NULL)的存在。
使用默認約束
默認約束指某列的默認值。其語法規則為:
字段名 數據類型 DEFAULT 默認值 mysql> CREATE TABLE tb_emp7( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25) NOT NULL, -> depId INT(11) DEFAULT 1111, -> salary FLOAT -> ); Query OK, 0 rows affected (0.03 sec)
設置表的屬性值自動增加
在數據庫應用中,經常希望在每次插入新紀錄時,系統自動生成字段的主鍵值。可以通過為表主鍵添加AUTO_INCREMENT 關鍵字來實現。其語法格式為:
字段名 數據類型 AUTO_INCREMENT mysql> CREATE TABLE tb_emp8( -> id INT(11) PRIMARY KEY AUTO_INCREMENT, -> name VARCHAR(25) NOT NULL, -> depId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO tb_emp8(name,salary) -> VALUES('Lucy',1000),('Lura',2000),('Kevin',3000); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb_emp8; +----+-------+--------+--------+ | id | name | deptId | salary | +----+-------+--------+--------+ | 1 | Lucy | NULL | 1000 | | 2 | Lura | NULL | 2000 | | 3 | Kevin | NULL | 3000 | +----+-------+--------+--------+ 3 rows in set (0.00 sec)
查看數據表結構
使用SQL語句創建好數據表之后,可以查看表結構的定義,以確定表的定義是否正確。在MySQL中,查看表結構可以使用DESCRIBE和SHOW CREATE TABLE語句。
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> 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, `depId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
3.2、修改數據表
修改數據表指的是修改數據庫中已經存在的數據表的結構。MySQL使用ALTER TABLE 語句修改表。常用的修改表的操作有:修改表名、修改字段數據類型或字段名、增加和刪除字段、修改字段的排列順序、更改表的存儲引擎、刪除表的外鍵約束等。
修改表名
修改表名的語法規則為:
ALTER TABLE <舊表名> RENAME [TO] <新表名> mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_dept2 | | tb_dept3 | | tb_emp1 | | tb_emp2 | | tb_emp5 | | tb_emp6 | | tb_emp8 | +----------------+ 8 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept3 RENAME TO tb_deptment3; Query OK, 0 rows affected (0.04 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_dept2 | | tb_deptment3 | | tb_emp1 | | tb_emp2 | | tb_emp5 | | tb_emp6 | | tb_emp8 | +----------------+ 8 rows in set (0.00 sec)
修改字段的數據類型
修改字段的數據類型,就是把字段的數據類型轉換成另一種數據類型,其語法規則為:
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(33); Query OK, 0 rows affected (0.04 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(33) | YES | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
修改字段名
MySQL中修改表字段名的語法規則為:
ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數據類型> mysql> DESC tb_dept1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | location | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50); Query OK, 0 rows affected (0.13 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(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
添加字段
添加字段的語法格式為:
ALTER TABLE <表名> ADD <新字段> <數據類型> [約束條件] [FIRST|AFTER 已存在字段名]
添加無完整約束條件的字段
mysql> ALTER TABLE tb_dept1 ADD managerId INT(10); Query OK, 0 rows affected (0.05 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(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
添加有完整約束條件的字段
mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) NOT NULL; Query OK, 0 rows affected (0.04 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(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
在表的第一列添加字段
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST; Query OK, 0 rows affected (0.04 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(33) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
在表的指定列之后添加字段
mysql> ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name; Query OK, 0 rows affected (0.05 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(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)
刪除字段
刪除字段是將數據表中的某個字段從表中移除,其語法格式為:
ALTER TABLE <表名> DROP <字段名> mysql> DESC tb_dept1; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | column2 | int(11) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | | | name | varchar(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) mysql> ALTER TABLE tb_dept1 DROP column2; Query OK, 0 rows affected (0.04 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(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | | column1 | varchar(12) | NO | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
修改字段的排列位置
對一個數據表來說,在創建的時候,字段在表中的排列順序已經確定。但是表的結構并不是完全不能改變,可以通過ALTER TABLE來改變表中字段的相對位置,語法格式為:
ALTER TABLE <表名> MODIFY <字段1> <數據類型> FIRST|AFTER <字段2>
修改字段為表的第一個字段
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST; Query OK, 0 rows affected (0.04 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(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
修改字段到表的指定列之后
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc; Query OK, 0 rows affected (0.04 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(33) | YES | | NULL | | | column3 | int(11) | YES | | NULL | | | loc | varchar(50) | YES | | NULL | | | column1 | varchar(12) | YES | | NULL | | | managerId | int(10) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
更改表的存儲引擎
更改表的數據引擎語法格式為:
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.06 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) mysql>
刪除表的外鍵約束
對于數據庫中定義的外鍵,如果不再需要,可以將其刪除。外鍵一旦刪除,就會解除主表和從表之間的關聯關系,MySQL中刪除外鍵的語法格式為:
ALTER TABLE <表名> FROP 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.03 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.04 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)
3.3、刪除數據表
刪除沒有被關聯的表
在MySQL中,使用DROP TABLE 可以一次刪除一個或多個沒有被其他表關聯的數據表,語法格式為:
DROP TABLE [IF EXISTS] 表1,表2,...表n mysql> DROP TABLE IF EXISTS tb_dept2; Query OK, 0 rows affected (0.04 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tb_dept1 | | tb_deptment3 | | tb_emp1 | | tb_emp2 | | tb_emp5 | | tb_emp6 | | tb_emp8 | | tb_emp9 | +----------------+ 8 rows in set (0.00 sec)
刪除被其他表關聯的主表
數據表之間存在外鍵關聯的情況下,如果直接刪除父表,結果會顯示失敗。原因是直接刪除,將破壞表的參照完整性。如果必須刪除,可以先刪除外鍵約束,再刪除父表。
mysql> CREATE TABLE tb_dept2 ( id INT(11) PRIMARY KEY, name VARCHAR(25), location VARCHAR(50) ); #創建父表 Query OK, 0 rows affected (0.03 sec) mysql> CREATE TABLE tb_emp ( id INT(11) PRIMARY KEY, name VARCHAR(25), de ptId INT(11), salary FLOAT, CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) R EFERENCES tb_dept2(id) ); #創建子表,外鍵約束 Query OK, 0 rows affected (0.03 sec) 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.10 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DROP TABLE tb_dept2; #成功刪除父表 Query OK, 0 rows affected (0.02 sec)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。