数据定义:CREATE、DROP、ALTER
6.5 数据定义: CREATE、DROP、ALTER6.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