⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06-5.html

📁 MySQL4.1.0 中文参考手册
💻 HTML
📖 第 1 页 / 共 4 页
字号:

<LI>

<A NAME="IDX1486"></A>
<A NAME="IDX1487"></A>
<CODE>FOREIGN KEY</CODE>、<CODE>CHECK</CODE> 和 <CODE>REFERENCES</CODE> 子句实际上不做任何事情,除了对于 InnoDB 类型的表,它支持 <CODE>ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...)</CODE>。
注意,InnoDB 不允许一个 <CODE>index_name</CODE> 被指定。查看章节 <A HREF="manual2.html#InnoDB">7.5  <CODE>InnoDB</CODE> 表</A>。
对于其它类型的表,这个句法仅仅为了兼容而提供,以更容易地从其它 SQL 服务器移植代码和更容易地运行以引用创建表的应用程序。查看章节 <A HREF="manual1.html#Differences_from_ANSI">1.8.4  MySQL 与 ANSI SQL92 相比不同的差别</A>。
</UL>

<P>
这里是一个例子,显示了 <CODE>ALTER TABLE</CODE> 的一些用法。我们以一个按如下方式创建一个表 <CODE>t1</CODE> 开始:
</P>

<PRE>
mysql&#62; CREATE TABLE t1 (a INTEGER,b CHAR(10));
</PRE>

<P>
为了将表 <CODE>t1</CODE> 重命名为 <CODE>t2</CODE>:
</P>

<PRE>
mysql&#62; ALTER TABLE t1 RENAME t2;
</PRE>

<P>
为了将列 <CODE>a</CODE> 从 <CODE>INTEGER</CODE> 改变为 <CODE>TINYINT NOT NULL</CODE>(列名不变),并将列 <CODE>b</CODE> 从 <CODE>CHAR(10)</CODE> 改变为 <CODE>CHAR(20)</CODE> ,同时也将 <CODE>b</CODE> 重命名为 <CODE>c</CODE>:
</P>

<PRE>
mysql&#62; ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
</PRE>

<P>
添加一个名为 <CODE>d</CODE> 的 <CODE>TIMESTAMP</CODE> c列:
</P>

<PRE>
mysql&#62; ALTER TABLE t2 ADD d TIMESTAMP;
</PRE>

<P>
在列 <CODE>d</CODE> 上增加一个索引,将列 <CODE>a</CODE> 设为主键:
</P>

<PRE>
mysql&#62; ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
</PRE>

<P>
移除列 <CODE>c</CODE>:
</P>

<PRE>
mysql&#62; ALTER TABLE t2 DROP COLUMN c;
</PRE>

<P>
添加一个名为 <CODE>c</CODE> 的 <CODE>AUTO_INCREMENT</CODE> 整型列:
</P>

<PRE>
mysql&#62; ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
           ADD INDEX (c);
</PRE>

<P>
注意,我们索引了 <CODE>c</CODE>,因为 <CODE>AUTO_INCREMENT</CODE> 列必须被索引,同样我们声明列 <CODE>c</CODE> 为 <CODE>NOT NULL</CODE>,因为被索引的列不能有 <CODE>NULL</CODE>。
</P>

<P>
当你添加一个 <CODE>AUTO_INCREMENT</CODE> 列时,列值会自动地以序列值填充。通过在 <CODE>ALTER TABLE</CODE> 或使用 <CODE>AUTO_INCREMENT = #</CODE> 表选项之前执行 <CODE>SET INSERT_ID=#</CODE> ,你可以设置第一个序列数字。查看章节 <A HREF="manual1.html#SET_OPTION">5.5.6  <CODE>SET</CODE> 句法</A>。
</P>

<P>
对于 MyISAM 表,如果你不改变 <CODE>AUTO_INCREMENT</CODE> 列,序列值将不会被影响。如果你移除一个<CODE>AUTO_INCREMENT</CODE> 列,并添加另一个 <CODE>AUTO_INCREMENT</CODE> 列,值将再次从 1 开始。
</P>

<P>
查看章节 <A HREF="manual2.html#ALTER_TABLE_problems">A.6.1  <CODE>ALTER TABLE</CODE> 的问题</A>。
</P>



<H3><A NAME="RENAME_TABLE"></A>6.5.5  <CODE>RENAME TABLE</CODE> 句法</H3>

<P>
<A NAME="IDX1488"></A>

</P>

<PRE>
RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2,...]
</PRE>

<P>
更名是以原子方式(atomically)执行,这就意味着,当更名正在运行时,其它的任何线程均不能该表。这使得以一个空表替换一个表成为可能。
</P>

<PRE>
CREATE TABLE new_table (...);
RENAME TABLE old_table TO backup_table, new_table TO old_table;
</PRE>

<P>
改名是从左到右执行的,这就意味着,如果你希望交换两个表名,你不得不这样做:
</P>

<PRE>
RENAME TABLE old_table    TO backup_table,
             new_table    TO old_table,
             backup_table TO new_table;
</PRE>

<P>
只要两个数据库在同一个磁盘上,你也可以从一个数据库更名到另一个数据库:
</P>

<PRE>
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
</PRE>

<P>
当你执行 <CODE>RENAME</CODE> 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 <CODE>ALTER</CODE> 和 <CODE>DROP</CODE> 权限,以及对新表的 <CODE>CREATE</CODE> 和 <CODE>INSERT</CODE> 权限。
</P>

<P>
如果在多表更名中,MySQL 遭遇到任何错误,它将对所有被更名的表进行倒退更名,将每件事物退回到最初状态。
</P>

<P>
<CODE>RENAME TABLE</CODE> 在 MySQL 3.23.23 中被加入。
</P>


<H3><A NAME="DROP_TABLE"></A>6.5.6  <CODE>DROP TABLE</CODE> 句法</H3>

<P>
<A NAME="IDX1489"></A>
<A NAME="IDX1490"></A>
<A NAME="IDX1491"></A>

</P>

<PRE>
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]
</PRE>

<P>
<CODE>DROP TABLE</CODE> 移除一个或多个表。所有的数据和表定义均被 <EM>移除</EM>,所以,<STRONG>一定要小心地</STRONG>使用这个命令!
</P>

<P>
在 MySQL 3.22 或更新的版本中,你可以使用关键词 <CODE>IF EXISTS</CODE> 防止表不存在时发生错误。在 4.1 中,当使用 <CODE>IF EXISTS</CODE> 时,对于所有不存在的表,你将得到一个 <CODE>NOTE</CODE>。查看章节 <A HREF="manual1.html#SHOW_WARNINGS">4.5.6.9  <CODE>SHOW WARNINGS | ERRORS</CODE></A>。
</P>

<P>
<CODE>RESTRICT</CODE> and <CODE>CASCADE</CODE> 被允许是为了更容易的移植。目前,他们不起任何作用。
</P>

<P>
<STRONG>注意:</STRONG><CODE>DROP TABLE</CODE> 将自动地提交当前活动的事务(除非你使用的是MySQL 4.1 ,并且使用了 <CODE>TEMPORARY</CODE> 关键词)。
</P>

<P>
选项 <CODE>TEMPORARY</CODE> 在 4.0 中被忽略。在 4.1 中,这人选项按如下所示工作:
</P>

<UL>
<LI>
只移除临时表。

<LI>
不结束一个运行着的事务。

<LI>
不会被检查访问权限。

</UL>

<P>
使用 <CODE>TEMPORARY</CODE> 是一个很好的安全方式,它可以防止你意外地移除一个真实的表。
</P>


<H3><A NAME="CREATE_INDEX"></A>6.5.7  <CODE>CREATE INDEX</CODE> 句法</H3>

<P>
<A NAME="IDX1492"></A>

</P>
<P>
<A NAME="IDX1493"></A>
<A NAME="IDX1494"></A>
<A NAME="IDX1495"></A>

</P>

<PRE>
CREATE [UNIQUE|FULLTEXT] INDEX index_name
       ON tbl_name (col_name[(length)],... )
</PRE>

<P>
<CODE>CREATE INDEX</CODE> 句法在 MySQL 3.22 以前的版本中不做任何事情。在 3.22 或以后的版本中,<CODE>CREATE INDEX</CODE> 被映射到一个 <CODE>ALTER TABLE</CODE> 语句来创建索引。查看章节 <A HREF="06-5.html#ALTER_TABLE">6.5.4  <CODE>ALTER TABLE</CODE> 句法</A>。
</P>

<P>
通常,在用 <CODE>CREATE TABLE</CODE> 创建表本身时你就创建表的所有索引。查看章节 <A HREF="06-5.html#CREATE_TABLE">6.5.3  <CODE>CREATE TABLE</CODE> 句法</A>。<CODE>CREATE INDEX</CODE> 允许你在一个现有表上添加索引。
</P>

<P>
<CODE>(col1,col2,...)</CODE> 格式的列列表创建一个多列索引。索引值由给定的列值连接而成。
</P>

<P>
对于 <CODE>CHAR</CODE> 和 <CODE>VARCHAR</CODE> 列,使用 <CODE>col_name(length)</CODE> 句法,可以只用一个列的部分来创建索引。(对于 <CODE>BLOB</CODE> 和 <CODE>TEXT</CODE> 列,长度是必须的。)这里的语句显示使用 <CODE>name</CODE> 列的前 10 个字符创建一个索引:
</P>

<PRE>
mysql&#62; CREATE INDEX part_of_name ON customer (name(10));
</PRE>

<P>
因为,大多数名字通常在前 10 个字符是不一样的,这个索引不应该比以整个 <CODE>name</CODE> 创建的索引慢。同样,使用部分列值创建的索引文件会更小一点,这将节省很多磁盘空间,也可以加速 <CODE>INSERT</CODE> 操作!
</P>

<P>
注意,如果你存在使用的是 MySQL 3.23.2 或更新的版本并且是 <CODE>MyISAM</CODE> 表类型,这时你才能在一个可以有 <CODE>NULL</CODE> 值的列上创建索引,以及在一个 <CODE>BLOB</CODE>/<CODE>TEXT</CODE>列上创建索引。
</P>

<P>
关于 MySQL 如何使用索引的更多信息,查看章节 <A HREF="manual1.html#MySQL_indexes">5.4.3  MySQL 如何使用索引</A>。
</P>

<P>
<CODE>FULLTEXT</CODE> 索引只能索引 <CODE>VARCHAR</CODE> 和 <CODE>TEXT</CODE> 列,而且只能应用于 <CODE>MyISAM</CODE> 表。<CODE>FULLTEXT</CODE> 索引在 MySQL 3.23.23 和更新的版本中可以使用。查看章节 <A HREF="06-8.html#Fulltext_Search">6.8  MySQL 全文搜索</A>。
</P>



<H3><A NAME="DROP_INDEX"></A>6.5.8  <CODE>DROP INDEX</CODE> 句法</H3>

<P>
<A NAME="IDX1496"></A>
<A NAME="IDX1497"></A>
<A NAME="IDX1498"></A>

</P>

<PRE>
DROP INDEX index_name ON tbl_name
</PRE>

<P>
<CODE>DROP INDEX</CODE> 从表 <CODE>tbl_name</CODE> 移除一个名为 <CODE>index_name</CODE> 的索引。在 MySQL 3.22 先前的版本中不做任何事情。在 3.22 或以后的版本中,<CODE>DROP INDEX</CODE> 被映射到一个 <CODE>ALTER TABLE</CODE> 语句来移除索引。查看章节 <A HREF="06-5.html#ALTER_TABLE">6.5.4  <CODE>ALTER TABLE</CODE> 句法</A>。
</P>



<H2>&nbsp;</H2>



</BODY>
 </HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -