【例4.1】建立員工表tb_emp1。數據庫
首先建立數據庫,SQL語句以下:ide
CREATE DATABASE test_db;ui
選擇建立表的數據庫,SQL語句以下:spa
USE test_db;ci
建立tb_emp1表,SQL語句爲:it
CREATE TABLE tb_emp1io
(table
id INT(11),class
name VARCHAR(25),test
deptId INT(11),
salary FLOAT
);
語句執行後,便建立了一個名稱爲tb_emp1的數據表,使用SHOW TABLES;語句查看數據表是否建立成功,SQL語句以下:
SHOW TABLES;
+-----------------------+
| Tables_in_ test_db |
+----------------------+
| tb_emp1 |
+----------------------+
1 row in set (0.00 sec)
能夠看到,test_db數據庫中已經有了數據表tb_tmp1,數據表建立成功。
【例4.2】定義數據表tb_emp 2,其主鍵爲id,SQL語句以下:
CREATE TABLE tb_emp2
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
【例4.3】定義數據表tb_emp 3,其主鍵爲id,SQL語句以下:
CREATE TABLE tb_emp3
(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
PRIMARY KEY(id)
);
上述兩個例子執行後的結果是同樣的,都會在id字段上設置主鍵約束。
【例4.4】定義數據表tb_emp4,假設表中間沒有主鍵id,爲了惟一肯定一個員工,能夠把name、deptId聯合起來作爲主鍵,SQL語句以下:
CREATE TABLE tb_emp4
(
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
PRIMARY KEY(name,deptId)
);
【例4.5】定義數據表tb_emp5,並在tb_emp5表上建立外鍵約束。
建立一個部門表tb_dept1,SQL語句以下:
CREATE TABLE tb_dept1
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);
定義數據表tb_emp5,讓它的鍵deptId做爲外鍵關聯到tb_dept1的主鍵id,SQL語句爲:
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)
);
以上語句執行成功以後,在表tb_emp5上添加了名稱爲fk_emp_dept1的外鍵約束,外鍵名稱爲deptId,其依賴於表tb_dept1的主鍵id。
【例4.6】定義數據表tb_emp6,指定員工的名稱不能爲空,SQL語句以下:
CREATE TABLE tb_emp6
(
id INT(11) PRIMARY KEY,
name VARCHAR(25) NOT NULL,
deptId INT(11),
salary FLOAT
);
【例4.7】定義數據表tb_dept2,指定部門的名稱惟一,SQL語句以下:
CREATE TABLE tb_dept2
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) UNIQUE,
location VARCHAR(50)
);
【例4.8】定義數據表tb_dept3,指定部門的名稱惟一,SQL語句以下:
CREATE TABLE tb_dept3
(
id INT(11) PRIMARY KEY,
name VARCHAR(22),
location VARCHAR(50),
CONSTRAINT STH UNIQUE(name)
);
【例4.9】定義數據表tb_emp7,指定員工的部門編號默認爲1111,SQL語句以下:
CREATE TABLE tb_emp7
(
id INT(11) PRIMARY KEY,
name VARCHAR(25) NOT NULL,
deptId INT(11) DEFAULT 1111,
salary FLOAT
);
【例4.10】定義數據表tb_emp8,指定員工的編號自動遞增,SQL語句以下:
CREATE TABLE tb_emp8
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(25) NOT NULL,
deptId INT(11),
salary FLOAT
);
例如,執行以下插入語句:
INSERT INTO tb_emp8 (name,salary)
VALUES('Lucy',1000), ('Lura',1200),('Kevin',1500);
語句執行完後,tb_emp8表中增長3條記錄,在這裏並無輸入id的值,但系統已經自動添加該值,使用SELECT命令查看記錄,以下所示。
SELECT * FROM tb_emp8;
【例4.11】分別使用DESCRIBE和DESC查看錶tb_dept1和表tb_emp1的表結構。
查看tb_dept1表結構,SQL語句以下:
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 | |
+-----------+---------------+------+-----+---------+--------+
查看tb_emp1表結構,SQL語句以下:
DESC tb_emp1;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id | int (11) | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int (11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+---------+-------------+-------+-----+---------+-------+
【例4.12】使用SHOW CREATE TABLE查看錶tb_emp1的詳細信息,SQL語句以下:
SHOW CREATE TABLE tb_emp1;
+--------+----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------+
| Table | Create Table
|
+--------+----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------+
| fruits | CREATE TABLE `fruits` (
`f_id` char(10) NOT NULL,
`s_id` int(11) NOT NULL,
`f_name` char(255) NOT NULL,
`f_price` decimal(8,2) NOT NULL,
PRIMARY KEY (`f_id`),
KEY `index_name` (`f_name`),
KEY `index_id_price` (`f_id`,`f_price`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+--------+----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------+
使用參數’\G’以後的結果以下:
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=gb2312
【例4.13】將數據表tb_dept3更名爲tb_deptment3。
使用ALTER TABLE將表tb_dept3更名爲tb_deptment3,SQL語句以下:
ALTER TABLE tb_dept3 RENAME tb_deptment3;
【例4.14】將數據表tb_dept1中name字段的數據類型由VARCHAR(22)修改爲VARCHAR(30)。
執行修改表名操做以前,使用DESC查看tb_dept表結構,結果以下:
DESC tb_dept1;
+----------+---------------+---------+--------+-------------+-------+
| Field | Type | Null | Key |Default | Extra |
+----------+---------------+---------+--------+-------------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+---------------+--------+---------+-------------+-------+
3 rows in set (0.00 sec)
能夠看到如今name字段的數據類型爲VARCHAR(22),下面修改其類型。輸入以下SQL語句並執行:
ALTER TABLE tb_dept1 MODIFY name VARCHAR(30);
【例4.15】將數據表tb_dept1中的location字段名稱改成loc,數據類型保持不變,SQL語句以下:
ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);
【例4.16】 將數據表tb_dept1中的loc字段名稱改成location,同時將數據類型變爲VARCHAR(60),SQL語句以下:
ALTER TABLE tb_dept1CHANGE loc location VARCHAR(60);
【例4.17】在數據表tb_dept1中添加一個沒有完整性約束的INT類型的字段managerId(部門經理編號),SQL語句以下:
ALTER TABLE tb_dept1 ADD managerId INT(10);
【例4.18】在數據表tb_dept1中添加一個不能爲空的VARCHAR(12)類型的字段column1,SQL語句以下:
ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) not null;
【例4.19】在數據表tb_dept1中添加一個INT類型的字段column2,SQL語句以下:
ALTER TABLE tb_dept 1ADD column2 INT(11) FIRST;
【例4.20】在數據表tb_dept1中name列後添加一個INT類型的字段column3,SQL語句以下:
ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name;
【例4.21】刪除數據表tb_dept1表中的column2字段。
刪除column2字段,SQL語句以下:
ALTER TABLE tb_dept1 DROP column2;
【例4.22】將數據表tb_dept中的column1字段修改成表的第一個字段,SQL語句以下:
ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;
【例4.23】將數據表tb_dept1中的column1字段插入到location字段後面,SQL語句以下:
ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER location;
【例4.24】將數據表tb_deptment3的存儲引擎修改成MyISAM。
在修改存儲引擎以前,先使用SHOW CREATE TABLE查看錶tb_deptment3當前的存儲引擎,結果以下。
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=gb2312
1 row in set (0.00 sec)
能夠看到,表tb_deptment3當前的存儲引擎爲ENGINE=InnoDB,接下來修改存儲引擎類型,輸入以下SQL語句並執行:
ALTER TABLE tb_deptment3 ENGINE=MyISAM;
使用SHOW CREATE TABLE再次查看錶tb_deptment3的存儲引擎,發現表tb_dept的存儲引擎變成了「MyISAM」,結果以下:
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=gb2312
1 row in set (0.00 sec)
【例4.25】刪除數據表tb_emp9中的外鍵約束。
首先建立表tb_emp9,建立外鍵deptId關聯tb_dept1表的主鍵id,SQL語句以下:
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)
);
使用SHOW CREATE TABLE查看錶tb_emp9的結構,結果以下:
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=gb2312
1 row in set (0.00 sec)
能夠看到,已經成功添加了表的外鍵,下面刪除外鍵約束,SQL語句以下:
ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept;
執行完畢以後,將刪除表tb_emp的外鍵約束,使用SHOW CREATE TABLE再次查看錶tb_emp9結構,結果以下:
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=gb2312
1 row in set (0.00 sec)
【例4.26】刪除數據表tb_dept2,SQL語句以下:
DROP TABLE IF EXISTS tb_dept2;
在數據庫中建立兩個關聯表,首先,建立表tb_dept2,SQL語句以下:
CREATE TABLE tb_dept2
(
id INT(11) PRIMARY KEY,
name VARCHAR(22),
location VARCHAR(50)
);
接下來建立表tb_emp,SQL語句以下:
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)
);
使用SHOW CREATE TABLE命令查看錶tb_emp的外鍵約束,結果以下:
SHOW CREATE TABLE tb_emp\G
*************************** 1. row ***************************
Table: tb_emp
Create Table: CREATE TABLE `tb_emp` (
`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_dept2` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)
能夠看到,以上執行結果建立了兩個關聯表tb_dept2和表tb_emp,其中tb_emp表爲子表,具備名稱爲fk_emp_dept的外鍵約束,tb_dept2爲父表,其主鍵id被子表tb_emp所關聯。
【例4.27】刪除被數據表tb_emp關聯的數據表tb_dept2。
首先直接刪除父表tb_dept2,輸入刪除語句以下:
DROP TABLE tb_dept2;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
能夠看到,如前所述,在存在外鍵約束時,主表不能被直接刪除。
接下來,解除關聯子表tb_emp的外鍵約束,SQL語句以下:
ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;
語句成功執行後,將取消表tb_emp和表tb_dept2之間的關聯關係,此時,能夠輸入刪除語句,將原來的父表tb_dept2刪除,SQL語句以下:
DROP TABLE tb_dept2;
最後經過SHOW TABLES;查看數據表列表,以下所示:
show tables;
+---------------------+
| Tables_in_test_db |
+---------------------+
| tb_dept |
| tb_deptment3 |
……省略部份內容
能夠看到,數據表列表中已經不存在名稱爲tb_dept2的表。