服务器 频道

MySQL for Linux on POWER-数据库创建简介

  以类似的方式创建其余的表。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 数据库服务器平台。
0
相关文章