以类似的方式创建其余的表。MySQL 允许您以非交互、批处理的方式执行语句。您可以将所有的数据库创建 SQL 代码存入一个文本文件,然后从那里执行它。下面是一个此类文件的示例:
-- Creating the database
CREATE DATABASE CONTRACTING;
-- Changing into the CONTRACTING database
USE CONTRACTING;
-- Creating table JOB
CREATE TABLE JOB (
JOB_CODE INTEGER NOT NULL UNIQUE,
JOB_NAME LONG VARCHAR NOT NULL,
JOB_HOUR_CHRG DECIMAL(10,2) NOT NULL,
PRIMARY KEY (JOB_CODE)) ENGINE=InnoDB;
-- Creating table EMPLOYEE
CREATE TABLE EMPLOYEE (
EMP_SSN CHAR(9) NOT NULL UNIQUE,
EMP_LNAME VARCHAR(50) NOT NULL,
EMP_FNAME VARCHAR(50) NOT NULL,
JOB_CODE INTEGER NOT NULL,
PRIMARY KEY (EMP_SSN),
FOREIGN KEY (JOB_CODE) REFERENCES JOB(JOB_CODE)
ON UPDATE CASCADE
ON DELETE RESTRICT) ENGINE=InnoDB;
-- Creating table PROJECT
CREATE TABLE PROJECT (
PRJ_NUM INTEGER NOT NULL UNIQUE,
PRJ_NAME VARCHAR(50) NOT NULL,
EMP_SSN CHAR(9) NOT NULL,
PRIMARY KEY (PRJ_NUM),
FOREIGN KEY (EMP_SSN) REFERENCES EMPLOYEE(EMP_SSN)
ON UPDATE CASCADE
ON DELETE RESTRICT) ENGINE=InnoDB;
-- Creating table ORDERFORM
CREATE TABLE ORDERFORM (
ORD_NUM INTEGER NOT NULL UNIQUE,
ORD_DATE DATE NOT NULL,
ORD_HOURS SMALLINT NOT NULL,
ORD_CHRG_HOUR DECIMAL(10,2) NOT NULL,
ORD_CHARGE DECIMAL(10,2) NOT NULL,
PRJ_NUM INTEGER NOT NULL,
EMP_SSN CHAR(9) NOT NULL,
PRIMARY KEY (ORD_NUM),
FOREIGN KEY (EMP_SSN) REFERENCES EMPLOYEE(EMP_SSN)
ON UPDATE CASCADE
ON DELETE RESTRICT,
FOREIGN KEY (PRJ_NUM) REFERENCES PROJECT(PRJ_NUM)
ON UPDATE CASCADE
ON DELETE RESTRICT) ENGINE=InnoDB;
注意创建表的顺序。被参照的表必须在进行参照的表之前创建。如果您将表的类型指定为 InnoDB,那么这个顺序就不会那么重要。不过,参照完整性将得不到保证。
要深入了解 MySQL 参照完整性,请参考 MySQL 产品文档中关于外部关键字的部分。
要通过上述文件执行 SQL 语句,您只需要在命令行中将其传递给 mysql,就可以读取文件,类似这样:
mysql -u username < filename
要深入了解 MySQL 的批处理使用模式,请参考 MySQL 产品文档。
要查看您创建的表结构,请输入下面的命令:
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_CONTRACTING |
+-----------------------+
| EMPLOYEE |
| JOB |
| ORDERFORM |
| PROJECT |
+-----------------------+
4 rows in set (0.00 sec)
mysql> DESCRIBE JOB;
+---------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| JOB_CODE | int(11) | | PRI | 0 | |
| JOB_NAME | mediumtext | | | | |
| JOB_HOUR_CHRG | decimal(10,2) | | | 0.00 | |
+---------------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> DESCRIBE EMPLOYEE;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| EMP_SSN | varchar(9) | | PRI | | |
| EMP_LNAME | varchar(50) | | | | |
| EMP_FNAME | varchar(50) | | | | |
| JOB_CODE | int(11) | | MUL | 0 | |
+-----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> DESCRIBE PROJECT;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| PRJ_NUM | int(11) | | PRI | 0 | |
| PRJ_NAME | varchar(50) | | | | |
| EMP_SSN | varchar(9) | | MUL | | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> DESCRIBE ORDERFORM;
+---------------+---------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+------------+-------+
| ORD_NUM | int(11) | | PRI | 0 | |
| ORD_DATE | date | | | 0000-00-00 | |
| ORD_HOURS | smallint(6) | | | 0 | |
| ORD_CHRG_HOUR | decimal(10,2) | | | 0.00 | |
| ORD_CHARGE | decimal(10,2) | | | 0.00 | |
| PRJ_NUM | int(11) | | MUL | 0 | |
| EMP_SSN | char(9) | | MUL | | |
+---------------+---------------+------+-----+------------+-------+
7 rows in set (0.00 sec)
注意,在 EMPLOYEE 表中,属性 EMP_SSN 的类型被从 CHAR(9) 转换为 VARCHAR(9)。如果一个表有一个 VARCHAR 类型的列,那么同一个表中长度大于 CHAR(3) 的 CHAR 类型会被转换为 VARCHAR 类型。当在同一张表中同时存在 CHAR 和 VARCHAR 类型时,这一转换会提高性能。
输入数据,并确认参照完整性
此时您就已经完成了数据库中表的创建,可以开始向表中填入数据。为此,可以使用 INSERT 语句,也可以从以制表符定界的文本文件中将数据导入表中。
INSERT INTO JOB (JOB_CODE, JOB_NAME, JOB_HOUR_CHRG)
VALUES (200, ''Application Designer'', 38.50);
要查看 JOB 表中加入的条目,请输入下面的内容:
mysql> SELECT * FROM JOB;
+----------+----------------------+---------------+
| JOB_CODE | JOB_NAME | JOB_HOUR_CHRG |
+----------+----------------------+---------------+
| 200 | Application Designer | 38.50 |
+----------+----------------------+---------------+
1 row in set (0.00 sec)
要通过文本文件向数据库填入数据,需要创建一个以制表符定界的文件。可以使用下面的示例文件来导入 JOB 表:
200 Application Programmer 35.48
201 Database Administrator 38.50
202 Technical Support 27.00
203 Database Designer 49.99
要通过这个文件导入数据,需要执行类似如下的命令:
mysql> LOAD DATA LOCAL INFILE "job_data_load.txt" INTO TABLE JOB;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
注意,如果文本文件不在启动 mysql 客户机的同一目录,则需要指定那个文件的绝对路径。在 LOAD DATA 语句中可以修改列值分隔符的缺省值。要获得关于从文本文件导入数据的更多资料,请参考 MySQL 产品文件。
要确认结果,请打印出 JOB 表中的所有行,如下:
mysql> SELECT * FROM JOB;
+----------+------------------------+---------------+
| JOB_CODE | JOB_NAME | JOB_HOUR_CHRG |
+----------+------------------------+---------------+
| 200 | Application Programmer | 35.48 |
| 201 | Database Administrator | 38.50 |
| 202 | Technical Support | 27.00 |
| 203 | Database Designer | 49.99 |
+----------+------------------------+---------------+
4 rows in set (0.00 sec)
同样,您可以填入其他表,记住,由于您使用的是 InnoDB 表类型,参照完整性是强制性的,因此,必须在填入进行参照的表之前先填入被参照的表。
比如,向 EMPLOYEE 表填入下面的数据:
mysql> SELECT * FROM EMPLOYEE;
+-----------+-----------+-----------+----------+
| EMP_SSN | EMP_LNAME | EMP_FNAME | JOB_CODE |
+-----------+-----------+-----------+----------+
| 600000001 | Smith | John | 201 |
| 600000002 | Johnson | James | 200 |
| 600000003 | Jones | Anne | 203 |
+-----------+-----------+-----------+----------+
3 rows in set (0.00 sec)
举例来说,您所指定的外部关键字约束将不允许您删除 JOB 表中 JOB_CODE 等于 203 的记录,因为有一位雇员,即 Anne Jones,他在 EMPLOYEE 表中的记录包含此工作代码。
mysql> DELETE FROM JOB WHERE JOB_CODE=203;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign
key constraint fails
可见,参照完整性规则不允许您删除正在由其他表参照的记录。不过,如果更新 JOB 表中的 JOB_CODE,那么进行参照的表也要进行这一更新,如下所示:
mysql> UPDATE JOB SET JOB_CODE=207 WHERE JOB_CODE=203;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM JOB;
+----------+------------------------+---------------+
| JOB_CODE | JOB_NAME | JOB_HOUR_CHRG |
+----------+------------------------+---------------+
| 200 | Application Programmer | 35.48 |
| 201 | Database Administrator | 38.50 |
| 202 | Technical Support | 27.00 |
| 207 | Database Designer | 49.99 |
+----------+------------------------+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM EMPLOYEE;
+-----------+-----------+-----------+----------+
| EMP_SSN | EMP_LNAME | EMP_FNAME | JOB_CODE |
+-----------+-----------+-----------+----------+
| 600000001 | Smith | John | 201 |
| 600000002 | Johnson | James | 200 |
| 600000003 | Jones | Anne | 207 |
+-----------+-----------+-----------+----------+
3 rows in set (0.00 sec)
为 MySQL 进行开发
由于 MySQL 的流行,有大量的开发团体在使用大部分主流编程调语言为 MySQL 编写应用程序。在 Linux 中(包括 Linux on POWER)有很多 API,让您能够使用以下编程语言编写与 MySQL 通信的应用程序,比如 PHP、Java、C、C++、Perl、Python 和 Ruby,这只是列出了很少的一些。在本系列的 第 2 部分 中深入了解在 Linux on POWER 上为 MySQL 所做的开发。
结束语
人们普遍认为 MySQL 是当前可用的性能较好的开放源代码企业级 Linux 关系数据库服务器之一。IBM 64-位 POWER 平台具备出众的性能、可靠性和高可用性,能够满足现今客户的所有需求。MySQL RDBMS 具备强健的特性,基于 IBM POWER 处理器的服务器具备微分区、动态启用和禁用 SMT 的能力,它们联合起来为市场提供了一个最为强大的 Linux 数据库服务器平台。
MySQL for Linux on POWER-数据库创建简介
0
相关文章