当前位置:操作系统 > Unix/Linux >>

数据定义:CREATE、DROP、ALTER

6.5 数据定义: CREATE、DROP、ALTER

  6.5.1 CREATE DATABASE 句法

  CREATE DATABASE [IF NOT EXISTS] db_name

  CREATE DATABASE 以给定名字创建一个数据库。允许的数据库名规则在章节 6.1.2 数据库、表、索引、列和别名 中被给出。 如果数据库已经存在,并且你没有指定 IF NOT EXISTS,这时会产生一个错误。

  在 MySQL 中,数据库以包含数据库表对应文件的目录实现的。因为数据库在初始创建时没有表,所以 CREATE DATABASE 语句只在 MySQL 数据目录下创建一个目录。

  你也可以使用 mysqladmin 创建一个数据库。查看章节 4.8 MySQL 客户端脚本和实用程序。

  6.5.2 DROP DATABASE 句法

  DROP DATABASE [IF EXISTS] db_name

  DROP DATABASE 移除数据库是的所有表并删除数据库。如果你在一个符号链接(symbolic link)数据库上执行一个 DROP DATABASE,链接与原始数据库均会被删除。要非常小心地使用这个命令!

  DROP DATABASE 返回从数据库目录下删除的文件数目。通常,它是表的数目的三倍,因为第张表通常对应于一个 “.MYD” 文件、一个 “.MYI” 文件和一个 “.frm” 文件。

  DROP DATABASE 命令从给定的数据库目录下移除以下列为扩展名的所有文件:

  扩展名 扩展名 扩展名 Ext

  .BAK .DAT .HSH .ISD

  .ISM .ISM .MRG .MYD

  .MYI .db .frm

  所有包含两个数字的子目录(RAID 目录)也同样被删除。

  在 MySQL 3.22 或以后的版本中,你可以使用关键词 IF EXISTS 以防止如果数据库不存在时发生错误。

  你也可以使用 mysqladmin 移除数据库。查看章节 4.8 MySQL 客户端脚本和实用程序。

  6.5.3 CREATE TABLE 句法

  CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]

  [table_options] [select_statement]

  or

  CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name LIKE old_table_name;

  create_definition:

  col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]

  [PRIMARY KEY] [reference_definition]

  or PRIMARY KEY (index_col_name,...)

  or KEY [index_name] (index_col_name,...)

  or INDEX [index_name] (index_col_name,...)

  or UNIQUE [INDEX] [index_name] (index_col_name,...)

  or FULLTEXT [INDEX] [index_name] (index_col_name,...)

  or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)

  [reference_definition]

  or CHECK (expr)

  type:

  TINYINT[(length)] [UNSIGNED] [ZEROFILL]

  or SMALLINT[(length)] [UNSIGNED] [ZEROFILL]

  or MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]

  or INT[(length)] [UNSIGNED] [ZEROFILL]

  or INTEGER[(length)] [UNSIGNED] [ZEROFILL]

  or BIGINT[(length)] [UNSIGNED] [ZEROFILL]

  or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]

  or DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]

  or FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]

  or DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]

  or NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]

  or CHAR(length) [BINARY]

  or VARCHAR(length) [BINARY]

  or DATE

  or TIME

  or TIMESTAMP

  or DATETIME

  or TINYBLOB

  or BLOB

  or MEDIUMBLOB

  or LONGBLOB

  or TINYTEXT

  or TEXT

  or MEDIUMTEXT

  or LONGTEXT

  or ENUM(value1,value2,value3,...)

  or SET(value1,value2,value3,...)

  index_col_name:

  col_name [(length)]

  reference_definition:

  REFERENCES tbl_name [(index_col_name,...)]

  [MATCH FULL | MATCH PARTIAL]

  [ON DELETE reference_option]

  [ON UPDATE reference_option]

  reference_option:

  RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

  table_options:

  TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }

  orAUTO_INCREMENT = #

  orAVG_ROW_LENGTH = #

  orCHECKSUM = {0 | 1}

  orCOMMENT = "string"

  orMAX_ROWS = #

  orMIN_ROWS = #

  orPACK_KEYS = {0 | 1 | DEFAULT}

  orPASSWORD = "string"

  orDELAY_KEY_WRITE = {0 | 1}

  or ROW_FORMAT= { default | dynamic | fixed | compressed }

  orRAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=#

  orUNION = (table_name,[table_name...])

  orINSERT_METHOD= {NO | FIRST | LAST }

  or DATA DIRECTORY="absolute path to directory"

  or INDEX DIRECTORY="absolute path to directory"

  select_statement:

  [IGNORE | REPLACE] SELECT ... (Some legal select statement)

  CREATE TABLE 以给定的名字在当前数据库创建一个表。允许的表名规则在章节 6.1.2 数据库、表、索引、列和别名 中被给出。如果没有当前数据库或表已经存在,一个错误将会发生。

  在 MySQL 3.22 或以后的版本中,表名可以被指定为 db_name.tbl_name。不管有没有当前数据库,它也能正常工作。

  从 MySQL 3.23 开始,在创建一个表时,你可以使用关键词 TEMPORARY。它的名字被限止在当前连接中,当连接关闭时,临时表会自动地被删除。这就意味着,两个不同的连接可以使用同一个临时表名而不会与另一个冲突,也不会与同名现有的表相冲突(现有表将被隐藏,只到临时表被删除)。从 MySQL 4.0.2 开始,为了能创建临时表,你必须有 CREATE TEMPORARY TABLES 权限。

  在 MySQL 3.23 或以后的版本中,你可以使用关键词 IF NOT EXISTS,因而如果表已存在,错误也不会发生。注意,它并不验证表结构是否一致。

  在 MySQL 4.1 中你可以使用 LIKE 来基于一个表定义创建另一个表。to create a table based on a table definition in another table. In MySQL 4.1 中,你同样也可以为一个被生成的列指定类型:

  CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar;

  第张表 tbl_name 由数据库目录下的一些文件表示。对于 MyISAM 类型的表,你将得到:

  文件 用途

  tbl_name.frm 表定义 (form) 文件

  tbl_name.MYD 数据文件

  tbl_name.MYI 索引文件

  对于各种列类型的性质的更多信息,查看章节 6.2 列类型:

  * 如果既没有指定 NULL 也没有指定 NOT NULL,列被视为指定了 NULL 。

  * 一个整型列可以有附加属性 AUTO_INCREMENT。当你插入一个 NULL 值(推荐)或 0 到一个 AUTO_INCREMENT 列,该列将被设置到 value+1,在这里,value 是表中当前列的最大值。AUTO_INCREMENT 序列以 1 开始。查看章节 8.1.3.130 mysql_insert_id()。 如果你一个 AUTO_INCREMENT 列中包含最大值的行,对于 ISAM 或 BDB 表,该值会被重新使用,但是对于一个 MyISAM 或 InnoDB 表,却不会被重用。如果你以 AUTOCOMMIT 模式执行 DELETE FROM table_name (没有一个 WHERE 子句) 删除表中的所有记录行,对于所有的表序列均重新开始。 注意:每个表只能有一个 AUTO_INCREMENT 列,并且必须被索引。MySQL 3.23 同样也只工作于 AUTO_INCREMENT 列只支持正值。插入一个负值将被当作插入一个很大的正值。这是为了避免数字从正到负“包装”的精度问题,也是为了确保不会意外地得到一个包含 0 的 AUTO_INCREMENT 列。 在 MyISAM 和 BDB 表中,你可以指定 AUTO_INCREMENT 多列索引中的第二个列。查看章节 3.5.9 使用 AUTO_INCREMENT. 为了使 MySQL 兼容某些 ODBC 应用程序,你可以用下列查询找出最后被插入的记录行:

  SELECT * FROM tbl_name WHERE auto_col IS NULL

  * 如果 MySQL 二进制日志被使用,CREATE TABLE 将自动地提交当前 InnoDB 事务。

  * NULL 值对于 TIMESTAMP 列的处理不同于其它的列类型。你不能在一个 TIMESTAMP 列中 存储一个文字 NULL;将列设置为 NULL 将设置它为当前的日期和时间。因为 TIMESTAMP 列的行为就是这样,列的 NULL 和 NOT NULL 属性不以常态方式影响它,如果你指定它们,将被忽略。 另一方面,为了使 MySQL 客户端更容易地使用 TIMESTAMP 列,服务器报告这样的列被赋值为 NULL 值(这是真的),即使 TIMESTAM
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,