📄 06-5.html
字号:
如果你对一个 <CODE>MyISAM</CODE> 表指定 <CODE>RAID_TYPE=STRIPED</CODE> ,<CODE>MyISAM</CODE> 将在数据库目录下创建 <CODE>RAID_CHUNKS</CODE> 子目录,并命名为 00, 01, 02 。在每个目录中,<CODE>MyISAM</CODE> 将创建一个 <CODE>table_name.MYD</CODE>。当将数据写入数据文件中时,<CODE>RAID</CODE> 处理器将映射第一个 <CODE>RAID_CHUNKSIZE</CODE> *1024 字节到第一个文件中,下一个 <CODE>RAID_CHUNKSIZE</CODE> *1024 字节到下一个文件中,等等。
<P></P>
<LI>
<CODE>UNION</CODE> 被用于当你希望将多个同样的表收集为一个时。它仅仅与 <CODE>MERGE</CODE> 表一起配合使用。查看章节 <A HREF="manual2.html#MERGE">7.2 <CODE>MERGE</CODE> 表</A>。
目前,在你将几个表映射为一个 <CODE>MERGE</CODE> 表时,你需要有对这些表的 <CODE>SELECT</CODE>、<CODE>UPDATE</CODE> 和
<CODE>DELETE</CODE> 权限。所有被映射的表必须与 <CODE>MERGE</CODE> 表在同一个数据库中。
<P></P>
<LI>
如果你希望向一个 <CODE>MERGE</CODE> 表中插入数据,你不得不用 <CODE>INSERT_METHOD</CODE> 指定记录行插入到哪一个表中。查看章节 <A HREF="manual2.html#MERGE">7.2 <CODE>MERGE</CODE> 表</A>。这个选项在 MySQL 4.0.0 中被引入。
<P></P>
<LI>
在创建表时,<CODE>PRIMARY</CODE> 键必须放在第一位,然后是所有 <CODE>UNIQUE</CODE> 键,再后是普通键。这可以帮助 MySQL 优化程序区分哪个键优先使用,同时更快地检测出重复的 <CODE>UNIQUE</CODE> 键。
<P></P>
<LI>
通过使用 <CODE>DATA DIRECTORY="directory"</CODE> 或 <CODE>INDEX DIRECTORY="directory"</CODE>,你可以指定存储引擎在什么地方存放它的表和索引文件。注意,目录必须以一个完整路径指定(不是相对路径)。
这仅仅工作于 <CODE>MySQL</CODE> 4.0 中的 <CODE>MyISAM</CODE> 表,并且你没有使用 <CODE>--skip-symlink</CODE> 选项。查看章节 <A HREF="manual1.html#Symbolic_links_to_tables">5.6.1.2 对表使用符号链接</A>。
</UL>
<H4><A NAME="Silent_column_changes"></A>6.5.3.1 隐式的列定义变化</H4>
<P>
<A NAME="IDX1463"></A>
</P>
<P>
在某些情况下,MySQL 隐式地改变一个在 <CODE>CREATE TABLE</CODE> 给定的列的规约。(这在 <CODE>ALTER TABLE</CODE> 中也可能发生。):
</P>
<UL>
<LI>
长度不超过四个字节的 <CODE>VARCHAR</CODE> 列被改变为 <CODE>CHAR</CODE>。
<P></P>
<LI>
如果在一个表中有任何一个列是变长的,则结果是整个记录行也是变长的。因此,如果一个表中包含任何变长的列(<CODE>VARCHAR</CODE>、<CODE>TEXT</CODE> 或 <CODE>BLOB</CODE>),所有长于 3 个字符的 <CODE>CHAR</CODE> 列将被改变为 <CODE>VARCHAR</CODE> 列。这在任何方面都不影响你如何使用该列;在 MySQL 中,<CODE>VARCHAR</CODE> 只是存储字符的另一个不同的方法。MySQL 执行这个转换,是因为它节省空间,并且使表操作更快。查看章节 <A HREF="manual2.html#Table_types">7 MySQL 表类型</A>。
<P></P>
<LI>
<CODE>TIMESTAMP</CODE> 的显示尺寸必须是在 2 到 14 范围之内的偶数。如果指定显示尺寸为 0 或超过 14,尺寸被强制设为 14。从 1 到 13 范围内的奇数值尺寸将被强制为下一个更大的偶数。
<P></P>
<LI>
你不能在一个 <CODE>TIMESTAMP</CODE> 列中存储一个文字 <CODE>NULL</CODE>;将一个 <CODE>NULL</CODE> 值赋给它将设置它为当前的日期和时间。因为 <CODE>TIMESTAMP</CODE> 列的行为就是这样,列的 <CODE>NULL</CODE> 和 <CODE>NOT NULL</CODE> 属性不以常态方式影响它,如果你指定它,将被忽略。<CODE>DESCRIBE tbl_name</CODE> 总是报告一个 <CODE>TIMESTAMP</CODE> 列被赋于了 <CODE>NULL</CODE> 值。
<P></P>
<LI>
MySQL 将其它 SQL 数据库供应商使用的列类型映射到 MySQL 类型。查看章节 <A HREF="06-2.html#Other-vendor_column_types">6.2.5 使用来自其它的数据库引擎的列类型</A>。
</UL>
<P>
如果你希望知道在你创建或改变了你的表后, MySQL 是否使用了不同于你所指定的列类型,你可以发出一个 <CODE>DESCRIBE tbl_name</CODE> 语句。
</P>
<P>
<A NAME="IDX1464"></A>
如果你使用 <CODE>myisampack</CODE> 压缩一个表,其它的某些列类型可能会发生改变。查看章节 <A HREF="manual2.html#Compressed_format">7.1.2.3 压缩表的特征</A>。
</P>
<H3><A NAME="ALTER_TABLE"></A>6.5.4 <CODE>ALTER TABLE</CODE> 句法</H3>
<P>
<A NAME="IDX1465"></A>
<A NAME="IDX1466"></A>
<A NAME="IDX1467"></A>
</P>
<PRE>
ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]
alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
or ADD [COLUMN] (create_definition, create_definition,...)
or ADD INDEX [index_name] (index_col_name,...)
or ADD PRIMARY KEY (index_col_name,...)
or ADD UNIQUE [index_name] (index_col_name,...)
or ADD FULLTEXT [index_name] (index_col_name,...)
or ADD [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
or CHANGE [COLUMN] old_col_name create_definition
[FIRST | AFTER column_name]
or MODIFY [COLUMN] create_definition [FIRST | AFTER column_name]
or DROP [COLUMN] col_name
or DROP PRIMARY KEY
or DROP INDEX index_name
or DISABLE KEYS
or ENABLE KEYS
or RENAME [TO] new_tbl_name
or ORDER BY col
or table_options
</PRE>
<P>
<CODE>ALTER TABLE</CODE> 允许你改变一个现有表的结构。例如,你可以添加或删除列,创建或撤销索引,更改现有列的类型或将列或表自身更名。你也可以改变表的注释和表的类型。查看章节 <A HREF="06-5.html#CREATE_TABLE">6.5.3 <CODE>CREATE TABLE</CODE> 句法</A>。
</P>
<P>
如果你使用 <CODE>ALTER TABLE</CODE> 来改变一个列规约,但是 <CODE>DESCRIBE tbl_name</CODE> 显示你的列并没有被修改,这有可能是因为章节 <A HREF="06-5.html#Silent_column_changes">6.5.3.1 隐式的列定义变化</A> 描述的一个原因,使 MySQL 忽略了你的修改。例如,如果你尝试将一个 <CODE>VARCHAR</CODE> 列更改为 <CODE>CHAR</CODE>,而如果在这个表中包含其它的变长列,MySQL 将仍然使用 <CODE>VARCHAR</CODE>。
</P>
<P>
<CODE>ALTER TABLE</CODE> 通过建立原初表的一个临时副本来工作。更改在副本上执行,然后原初表将被删除,临时表被换名。这样做使所有的修改自动地转向到没有任何更新失败的新表。当 <CODE>ALTER TABLE</CODE> 执行时,原初表可被其它客户端读取。更新与写入被延迟到新的表准备好。
</P>
<P>
注意,如果你以除 <CODE>RENAME</CODE> 之外的其它选项使用 <CODE>ALTER TABLE</CODE> ,MySQL 将总是创建一个临时表,即使数据并不确实需要被复制(就像当你改变一个列名时)。我们计划不久来修正它,但是通常人们是不经常执行 <CODE>ALTER TABLE</CODE>的,所以在我们的 TODO 上,这个修正并不是急于处理的。对于 MyISAM 表,你可以将变量 <CODE>myisam_sort_buffer_size</CODE> 设置和高一点,以加速索引的重建部分(这是重建进程中最慢的部分)。
</P>
<UL>
<LI>
为了使用 <CODE>ALTER TABLE</CODE>,你需要在这个表上有 <CODE>ALTER</CODE>、<CODE>INSERT</CODE> 和 <CODE>CREATE</CODE> 权限。
<P></P>
<LI>
<CODE>IGNORE</CODE> 是 MySQL 对 ANSI SQL92 的扩展。它用于控制当在新表中的唯一键上出现重复值时,<CODE>ALTER TABLE</CODE> 如何工作。如果 <CODE>IGNORE</CODE> 没有被指定,副本将被放弃并回退。如果 <CODE>IGNORE</CODE> 被指定,那么在唯一键上重复的记录行只有第一个记录行被使用;其它的均被删除。
<P></P>
<LI>
你可以在单个的 <CODE>ALTER TABLE</CODE> 语句中发出多个 <CODE>ADD</CODE>、<CODE>ALTER</CODE>、<CODE>DROP</CODE> 和 <CODE>CHANGE</CODE> 子句。这是 MySQL 对 ANSI SQL92 的扩展,ANSI SQL92 只允许在每个 <CODE>ALTER TABLE</CODE> 语句中一个子句。
<P></P>
<LI>
<CODE>CHANGE col_name</CODE>、<CODE>DROP col_name</CODE> 和 <CODE>DROP INDEX</CODE> 是 MySQL 对 ANSI SQL92 的扩展。
<P></P>
<LI>
<CODE>MODIFY</CODE> is an Oracle extension to <CODE>ALTER TABLE</CODE>.
<LI>
可选词 <CODE>COLUMN</CODE> 只是一个无用词组,可被忽略。
<P></P>
<LI>
如果你使用 <CODE>ALTER TABLE tbl_name RENAME TO new_name</CODE>,并没有任何其它的选项,MySQL 将简单地重命名与表
<CODE>tbl_name</CODE> 的文件。这不需要创建临时表。查看章节 <A HREF="06-5.html#RENAME_TABLE">6.5.5 <CODE>RENAME TABLE</CODE> 句法</A>。
<P></P>
<LI>
<CODE>create_definition</CODE> 子句使用与 <CODE>CREATE TABLE</CODE> 相同的 <CODE>ADD</CODE> 和 <CODE>CHANGE</CODE> 句法。注意,这些句法不仅包含列类型,还要包含列名。查看章节 <A HREF="06-5.html#CREATE_TABLE">6.5.3 <CODE>CREATE TABLE</CODE> 句法</A>。
<P></P>
<LI>
你可以使用一个 <CODE>CHANGE old_col_name create_definition</CODE> 子句来重命名一个列。为了这样做,你必须指定旧的和新的列名,以及列当前的类型。例如,为了将一个 <CODE>INTEGER</CODE> 列 <CODE>a</CODE> 重命名为 <CODE>b</CODE>,你必须这样做:
<PRE>
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
</PRE>
如果你希望改变一个列的类型而不是列名,<CODE>CHANGE</CODE> 句法仍然需要有两个列名,即使它们是一样的。例如:
<PRE>
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
</PRE>
然后,到 MySQL 3.22.16a 时,你也可以使用 <CODE>MODIFY</CODE> 来改变一个列的类型而不需要重命名它:
<PRE>
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
</PRE>
<LI>
如果你使用 <CODE>CHANGE</CODE> 或 <CODE>MODIFY</CODE> 缩短一个列,而该列上存在一个取列部分值的索引(举例来说,如果你有一个索引在一个 <CODE>VARCHAR</CODE> 列的前 10 个字符上),那么,你将不能使列短于索引的字符数目。
<P></P>
<LI>
当你使用 <CODE>CHANGE</CODE> 或 <CODE>MODIFY</CODE> 改变一个列类型时,MySQL 将尝试尽可能地将数据转换到新的类型。
<P></P>
<LI>
在 MySQL 3.22 或更新的版本中,你可以使用 <CODE>FIRST</CODE> 或 <CODE>ADD ... AFTER col_name</CODE> 在一个表中的某个特定位置添加一列。缺省是增加到最后一列。从 MySQL 4.0.1 开始,你也可以在 <CODE>CHANGE</CODE> 或 <CODE>MODIFY</CODE> 中使用关键词 <CODE>FIRST</CODE> 和 <CODE>AFTER</CODE> 。
<P></P>
<A NAME="IDX1468"></A>
<A NAME="IDX1469"></A>
<A NAME="IDX1470"></A>
<A NAME="IDX1471"></A>
<A NAME="IDX1472"></A>
<LI>
<CODE>ALTER COLUMN</CODE> 可以为一列指定一个新的缺省值或删除老的缺省值。如果老的缺省值被移除且列可以被设为 <CODE>NULL</CODE>,新的缺省值将是 <CODE>NULL</CODE>。如果该列不允许有 <CODE>NULL</CODE>值,MySQL 以章节 <A HREF="06-5.html#CREATE_TABLE">6.5.3 <CODE>CREATE TABLE</CODE> 句法</A> 中的描述方式为该列赋于一个缺省值。
<P></P>
<A NAME="IDX1473"></A>
<A NAME="IDX1474"></A>
<A NAME="IDX1475"></A>
<LI>
<CODE>DROP INDEX</CODE> 移除一个索引。这是 MySQL 对 ANSI SQL92 的一个扩展。查看章节 <A HREF="06-5.html#DROP_INDEX">6.5.8 <CODE>DROP INDEX</CODE> 句法</A>。
<P></P>
<LI>
如果列被从一个表中移除,列也将从任何有它为组成部分的索引中被移除。如果组成一个索引的所有列均被移除了,那么,该索引也将被移除。
<P></P>
<LI>
如果一个表只包含一个列,那么该列不能被移除。如果你本就打算移除该表,请使用 <CODE>DROP TABLE</CODE> 代替。
<P></P>
<A NAME="IDX1476"></A>
<A NAME="IDX1477"></A>
<A NAME="IDX1478"></A>
<LI>
<CODE>DROP PRIMARY KEY</CODE> 移除主索引。如果这样的索引不存在,它将移除表中的第一个 <CODE>UNIQUE</CODE> 索引。(如果没有 <CODE>PRIMARY KEY</CODE> 被明确指定,MySQL 将第一个 <CODE>UNIQUE</CODE> 键标记为 <CODE>PRIMARY KEY</CODE> )
<A NAME="IDX1479"></A>
<A NAME="IDX1480"></A>
如果你添加一个 <CODE>UNIQUE INDEX</CODE> 或 <CODE>PRIMARY KEY</CODE> 到一个表中,它将被存储在任何非 <CODE>UNIQUE</CODE> 索引之前,因而,MySQL 可以尽可能地检测出重复键。
<P></P>
<A NAME="IDX1481"></A>
<LI>
<CODE>ORDER BY</CODE> 允许你以指定的记录行顺序创建一个新表。注意,在插入与删除后,该表将不会保留这个顺序。在某些情况下,如果表在你以后希望排序的列上是有序的,这将使得 MySQL 排序时更加得容易。当你知道你主要查询的行以一个确定的次序时,这将是很有用的。在对表进行过大的改变后,通过使用这个选项,你可能会得到更高的性能。
<P></P>
<A NAME="IDX1482"></A>
<A NAME="IDX1483"></A>
<A NAME="IDX1484"></A>
<LI>
如果你在一个 <CODE>MyISAM</CODE> 表上使用 <CODE>ALTER TABLE</CODE> ,所有非唯一的索引将以一个分批方式创建(就像 <CODE>REPAIR</CODE> 一样)。当你有很多索引时,这可能使 <CODE>ALTER TABLE</CODE> 更快一点。
<P></P>
<LI>
从 <STRONG>MySQL 4.0</STRONG> 开始,上面的特性可明确地激活。<CODE>ALTER TABLE ... DISABLE KEYS</CODE> 使 MySQL 停止更新 <CODE>MyISAM</CODE> 表的非唯一索引。然后 <CODE>ALTER TABLE ... ENABLE KEYS</CODE> 可以被用来重建丢失的索引。因为 MySQL 以特殊的算法执行它,这将比一个接一个地插入索引要快得多,禁用键可以很大程序上的加速一个大批量的插入。
<P></P>
<LI>
<A NAME="IDX1485"></A>
使用 C API 函数 <CODE>mysql_info()</CODE>,你可以找出有多少记录被拷贝,以及(当 <CODE>IGNORE</CODE> 被使用时)有多少记录因唯一键值重复而被删除。
<P></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -