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

📄 06-5.html

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

在 MyISAM 和 BDB 表中,你可以指定 <CODE>AUTO_INCREMENT</CODE> 多列索引中的第二个列。查看章节 <A HREF="manual1.html#example-AUTO_INCREMENT">3.5.9  使用 <CODE>AUTO_INCREMENT</CODE></A>.

<A NAME="IDX1453"></A>
<A NAME="IDX1454"></A>
为了使 MySQL 兼容某些 ODBC 应用程序,你可以用下列查询找出最后被插入的记录行:

<PRE>
SELECT * FROM tbl_name WHERE auto_col IS NULL
</PRE>

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

<P></P>

<LI>
<CODE>NULL</CODE> 值对于 <CODE>TIMESTAMP</CODE> 列的处理不同于其它的列类型。你不能在一个 <CODE>TIMESTAMP</CODE> 列中 存储一个文字 <CODE>NULL</CODE>;将列设置为 <CODE>NULL</CODE> 将设置它为当前的日期和时间。因为 <CODE>TIMESTAMP</CODE> 列的行为就是这样,列的 <CODE>NULL</CODE> 和 <CODE>NOT NULL</CODE> 属性不以常态方式影响它,如果你指定它们,将被忽略。

另一方面,为了使 MySQL 客户端更容易地使用 <CODE>TIMESTAMP</CODE> 列,服务器报告这样的列被赋值为 <CODE>NULL</CODE> 值(这是真的),即使 <CODE>TIMESTAMP</CODE> 实际上决不会包含一个 <CODE>NULL</CODE> 值。当你使用 <CODE>DESCRIBE tbl_name</CODE> 得到有关你的表的描述时,你就会明白这点。

注意,设置一个 <CODE>TIMESTAMP</CODE> 列为 <CODE>0</CODE> 不等同于设置它为 <CODE>NULL</CODE>,因为 <CODE>0</CODE> 是一个有效的 <CODE>TIMESTAMP</CODE> 值。

<P></P>

<LI>

<A NAME="IDX1455"></A>
<CODE>DEFAULT</CODE> 值必须是一个常量,不可以是一个函数或一个表达式。

如果一个列没有指定 <CODE>DEFAULT</CODE> 值,MySQL 将自动地赋于一个,规则如下:

如果列可以接受 <CODE>NULL</CODE> 作为一个值,缺省值为 <CODE>NULL</CODE>。

如果列被定义为 <CODE>NOT NULL</CODE>,缺省值取决于列的类型:

<UL>
<LI>
对于没有声明 <CODE>AUTO_INCREMENT</CODE> 属性的数字类型,缺省值为 <CODE>0</CODE>。对于一个 <CODE>AUTO_INCREMENT</CODE> 列,缺省值为序列中的下一个值。

<P></P>

<LI>
对于非 <CODE>TIMESTAMP</CODE> 的日期和时间类型,缺省值是该类型适当的零值。对于表中的第一个 <CODE>TIMESTAMP</CODE> 列,缺省值为当前的日期和时间。查看章节 <A HREF="06-2.html#Date_and_time_types">6.2.2  Date 和 Time 类型</A>。

<P></P>

<LI>
对于非 <CODE>ENUM</CODE> 的字符串类型,缺省值是空字符串。对于 <CODE>ENUM</CODE>,缺省值为第一个枚举值。

<P></P>

</UL>
缺省值必须是常量。这意味着,例如,对于一个日期列,你不能将一个像 <CODE>NOW()</CODE> 或 <CODE>CURRENT_DATE</CODE> 的函数设置为缺省值。

<P></P>

<LI>

<CODE>KEY</CODE> 是 <CODE>INDEX</CODE> 的同义词。

<P></P>

<LI>
在 MySQL 中,一个 <CODE>UNIQUE</CODE> 键只能有不同的值。如果你试图以匹配一个现有行的键添加新行,将产生一个错误。

<P></P>

<LI>

<A NAME="IDX1456"></A>
<CODE>PRIMARY KEY</CODE> 是一个唯一 <CODE>KEY</CODE>,它还有一个额外的约束,所有键列必须被定义为 <CODE>NOT NULL</CODE>。在 MySQL 中,该被命名为 <CODE>PRIMARY</CODE>。一张表只能有一个 <CODE>PRIMARY KEY</CODE>。如果在你的表中没有一个 <CODE>PRIMARY KEY</CODE>,而某些应用程序要求 <CODE>PRIMARY KEY</CODE>,MySQL 将返回第一个没有任何 <CODE>NULL</CODE> 列的 <CODE>UNIQUE</CODE> 键,做为 <CODE>PRIMARY KEY</CODE>。

<P></P>

<LI>
一个 <CODE>PRIMARY KEY</CODE> 可以是一个多列索引。然而,你不能在一个列规格说明中使用 <CODE>PRIMARY KEY</CODE> 键属性来创建一个多列索引。这样做将仅仅标记单个列做为主键。你必须使用 <CODE>PRIMARY KEY(index_col_name, ...)</CODE> 句法。

<P></P>

<LI>
如果 <CODE>PRIMARY</CODE> 或 <CODE>UNIQUE</CODE> 键只由一个列组成,并且列类型是整型,你可以用 <CODE>_rowid</CODE> 引用它。(在版本 3.23.11 中新加入)。

<P></P>

<LI>
如果你不为一个索引指派一个名字,索引名将被指派为与第一个 <CODE>index_col_name</CODE> 相同的名字,以一个可选后缀 (<CODE>_2</CODE>,<CODE>_3</CODE>, <CODE>...</CODE>) 使它唯一。使用 <CODE>SHOW INDEX FROM tbl_name</CODE> 可以从一个表中查看索引名。查看章节 <A HREF="manual1.html#SHOW_DATABASE_INFO">4.5.6.1  检索有关数据库、表、列和索引的信息</A>。

<P></P>

<LI>
<A NAME="IDX1457"></A>
<A NAME="IDX1458"></A>
只有 <CODE>MyISAM</CODE>、<CODE>InnoDB</CODE> 和 <CODE>BDB</CODE> 表类型支持在可以有 <CODE>NULL</CODE> 值的列上索引。在其它情况下,你必须声明这个列为 <CODE>NOT NULL</CODE> 或者得到一个错误结果。

<P></P>

<LI>
使用 <CODE>col_name(length)</CODE> 句法,你可以一个索引只使用一个 <CODE>CHAR</CODE> 或 <CODE>VARCHAR</CODE> 列的一部分。这可以使索引文件更小一点。查看章节 <A HREF="manual1.html#Indexes">5.4.4  列索引</A>。

<P></P>

<LI>
<A NAME="IDX1459"></A>
<A NAME="IDX1460"></A>
<A NAME="IDX1461"></A>
<A NAME="IDX1462"></A>
只有 <CODE>MyISAM</CODE> 表类型运动在 <CODE>BLOB</CODE> 和 <CODE>TEXT</CODE> 列上索引。当在一个 <CODE>BLOB</CODE> 或 <CODE>TEXT</CODE> 列上放置一个索引时,你必须总是指定索引的长度:

<PRE>
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
</PRE>

<LI>
当你对一个 <CODE>TEXT</CODE> 或 <CODE>BLOB</CODE> 列使用 <CODE>ORDER BY</CODE> 或 <CODE>GROUP BY</CODE> 时,只有最前面 的 <CODE>max_sort_length</CODE> 字节被使用。查看章节 <A HREF="06-2.html#BLOB">6.2.3.2  <CODE>BLOB</CODE> 和 <CODE>TEXT</CODE> 类型</A>。

<P></P>

<LI>
在 MySQL 3.23.23 或更新的版本中,你也可以创建特殊的 <CODE>FULLTEXT</CODE> 索引。他们被用于全文搜索。只有 <CODE>MyISAM</CODE> 表类型支持 <CODE>FULLTEXT</CODE> 索引。他只能从 <CODE>CHAR</CODE>、<CODE>VARCHAR</CODE> 和 <CODE>TEXT</CODE> 列建立。索引总是建立在整个列上;部分索引是不支持的。详细操作请查看章节 <A HREF="06-8.html#Fulltext_Search">6.8  MySQL 全文搜索</A>。

<P></P>

<LI>

在 MySQL 3.23.44 或更新的版本中,<CODE>InnoDB</CODE> 表支持外键约束检查。查看章节 <A HREF="manual2.html#InnoDB">7.5  <CODE>InnoDB</CODE> 表</A>。注意,InnoDB 中的 <CODE>FOREIGN KEY</CODE> 句法比上面介绍的句法有更多的限制。InnoDB 不允许 
<CODE>index_name</CODE> 被指定,参考表的列总是必须明确命名。从 4.0.8 开始,InnoDB 在外键上支持 <CODE>ON DELETE</CODE> 和 <CODE>ON UPDATE</CODE> 动作。精确句法查看 InnoDB 手册章节。查看章节 <A HREF="manual2.html#InnoDB">7.5  <CODE>InnoDB</CODE> 表</A>。
对于其它的表类型,MySQL 服务器对 <CODE>CREATE TABLE</CODE> 命令中的 <CODE>FOREIGN KEY</CODE>、<CODE>CHECK</CODE> 和 <CODE>REFERENCES</CODE> 句法作语法分析,但是没有更进一步的行为。查看章节 <A HREF="manual1.html#ANSI_diff_Foreign_Keys">1.8.4.5  外键</A>。

<P></P>

<LI>

每个 <CODE>NULL</CODE> 列占据额外的一个比特,取舍到最接近的字节。

<P></P>

<LI>
最大记录的字节长度可以按下面的计算得出:

<PRE>
row length = 1
             + (sum of column lengths)
             + (number of NULL columns + 7)/8
             + (number of variable-length columns)
</PRE>

<LI>
<CODE>table_options</CODE> 和 <CODE>SELECT</CODE> 选项只在 MySQL 3.23 和以后的版本中被实现。

不同的表类型为:
<P></P>

<TABLE BORDER WIDTH="90%">
<TR><TD><STRONG>表类型 </STRONG> </TD><TD> <STRONG>含义 </STRONG>
</TD></TR>
<TR><TD>BDB 或 BerkeleyDB  </TD><TD> 以页锁定的事务安全型表。查看章节 <A HREF="manual2.html#BDB">7.6  <CODE>BDB</CODE> 或 <CODE>BerkeleyDB</CODE> 表</A>
</TD></TR>
<TR><TD>HEAP </TD><TD> 这个表的数据只存放在内存中。查看章节 <A HREF="manual2.html#HEAP">7.4  <CODE>HEAP</CODE> 表</A>
</TD></TR>
<TR><TD>ISAM </TD><TD> 最初的存储引擎。查看章节 <A HREF="manual2.html#ISAM">7.3  <CODE>ISAM</CODE> 表</A>
</TD></TR>
<TR><TD>InnoDB </TD><TD> 以行锁定的事务安全型表。查看章节 <A HREF="manual2.html#InnoDB">7.5  <CODE>InnoDB</CODE> 表</A>
</TD></TR>
<TR><TD>MERGE </TD><TD> 做为一个表使用的 MyISAM 表的收集品。查看章节 <A HREF="manual2.html#MERGE">7.2  <CODE>MERGE</CODE> 表</A>
</TD></TR>
<TR><TD>MRG_MyISAM </TD><TD> MERGE 表的别名
</TD></TR>
<TR><TD>MyISAM </TD><TD> 用于代替 ISAM 的新的轻便型二进制存储引擎。查看章节  <A HREF="manual2.html#MyISAM">7.1  <CODE>MyISAM</CODE> 表</A>
</TD></TR>
</TABLE>

<P></P>

查看章节 <A HREF="manual2.html#Table_types">7  MySQL 表类型</A>。

如果一个表类型被指定,而那个特殊类型是不可用的,MySQL 将选择最接近于你所指定类型的表类型。例如,如果 <CODE>TYPE=BDB</CODE> 被指定,而当前版本的 MySQL 不支持 <CODE>BDB</CODE> 表,该将会做为 <CODE>MyISAM</CODE> 表代替被创建。

其它的表选项是用于优化表行为的。在大多数情况下,你不必指定他们中的任何一个。选项对所有表均适用,如果不适用则另外说明:

<P></P>

<TABLE BORDER WIDTH="90%">
<TR><TD><STRONG>选项 </STRONG> </TD><TD> <STRONG>含义 </STRONG>
</TD></TR>
<TR><TD><CODE>AUTO_INCREMENT</CODE> </TD><TD> 你想要为你的表设定的下一个 <CODE>AUTO_INCREMENT</CODE> 值。(MyISAM)
</TD></TR>
<TR><TD><CODE>AVG_ROW_LENGTH</CODE> </TD><TD> 你的表的平均行长度的近似值。你只需为有变长记录的大表设置它
</TD></TR>
<TR><TD><CODE>CHECKSUM</CODE> </TD><TD> 如果你希望 MySQL 对所有的记录行维持一个检验和(这将使表在更新时变得更慢,但是使得更容易地发现损坏的表),设置它为 1。(MyISAM)
</TD></TR>
<TR><TD><CODE>COMMENT</CODE> </TD><TD> 对于你的表的一个 60 个字符的注释
</TD></TR>
<TR><TD><CODE>MAX_ROWS</CODE> </TD><TD> 你计划在表中存储的最大记录行数目
</TD></TR>
<TR><TD><CODE>MIN_ROWS</CODE> </TD><TD> 你计划在表中存储的最小记录行数目
</TD></TR>
<TR><TD><CODE>PACK_KEYS</CODE> </TD><TD> 如果你希望有更小的索引,设置它为 1。这通常使的更新更加得慢,面读取列快 (MyISAM, ISAM)。设置它为 0,将禁用所有键压缩。设置它为 <CODE>DEFAULT</CODE> (MySQL 4.0),将告诉存储引擎仅仅压缩长的 <CODE>CHAR</CODE>/<CODE>VARCHAR</CODE> 列
</TD></TR>
<TR><TD><CODE>PASSWORD</CODE> </TD><TD> 以一个密码加密 <TT>`.frm'</TT> 文件。在 MySQL 标准版中,这个选项不做任何事
</TD></TR>
<TR><TD><CODE>DELAY_KEY_WRITE</CODE> </TD><TD> 如果希望延迟键表更新,直到该表被关闭,设置它为 1。(MyISAM).
</TD></TR>
<TR><TD><CODE>ROW_FORMAT</CODE> </TD><TD> 定义记录行如何被存储。目前,这个选项只能工作于 MyISAM 表,它支持 <CODE>DYNAMIC</CODE> 和 <CODE>FIXED</CODE> 行格式。查看章节 <A HREF="manual2.html#MyISAM_table_formats">7.1.2  <CODE>MyISAM</CODE> 表格式</A>
</TD></TR>
</TABLE>

<P></P>
当你使用一个 <CODE>MyISAM</CODE> 表时,MySQL 使用 <CODE>max_rows * avg_row_length</CODE> 的乘积来最终表将有多大。如果你不指定上面的任何选项,一个表的最大民族教育将是 4G (或 2G ,如果你的操作系统仅支持 2G 的最大文件)。原因是仅仅是为了控制指针范围使索引更小和更快,如果您真的不需要大文件。

如果你不使用 <CODE>PACK_KEYS</CODE>,缺省仅仅压缩字符串,不压缩数字。如果你使用 <CODE>PACK_KEYS=1</CODE>,数字也将被很好地压缩。

当压缩二进制数字键时,MySQL 将使用 prefix 压缩。这就意味着,如果有许多同样的数字,你才能得到很大的益处。Prefix 压缩意味着每个键都需要一个额外的字节来指示前一个键有多少字节与下一个键相同(注意,行指针被以高元组第一次序(high-byte-first-order)直接地存储在键后,以改善压缩)。这就意味着,如果在一个记录行上有连续两行的相等键,下面所有“相同”的键通常只占用 2 个字节(包括记录行指针)。与通常情况下相比,下面的“相同”键将占用 storage_size_for_key + pointer_size (通常 4) 个字节。另一方面,如果所有的键都是不同的,你将在每个键上损失 1 字节,如果该键不是一个可以有 <CODE>NULL</CODE> 值的键。(在这种情况下,压缩后键的长度将存储在用于键是否为 <CODE>NULL</CODE> 的位元组中。)

<P></P>

<LI>
如果你在一个  <CODE>CREATE</CODE> 语句中指定一个 <CODE>SELECT</CODE>,MySQL 为 <CODE>SELECT</CODE> 中的所有元素创建新的字段。例如:

<PRE>
mysql&#62; CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
    -&#62;        PRIMARY KEY (a), KEY(b))
    -&#62;        TYPE=MyISAM SELECT b,c FROM test2;
</PRE>

这将创建一个有三个列的 <CODE>MyISAM</CODE> 表,a、b 和 c 。请注意,<CODE>SELECT</CODE> 语句中的列被添加到表的右边,而不是重叠在上面。看下面的例子:

<PRE>
mysql&#62; SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+

mysql&#62; CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql&#62; SELECT * FROM bar;
+------+---+
| m    | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)
</PRE>

对于表 <CODE>foo</CODE> 中每个记录行,一个以从表 <CODE>foo</CODE> 来的值和新列的缺省值组成的记录行被插入到表 <CODE>bar</CODE> 中。

<CODE>CREATE TABLE ... SELECT</CODE> 不会为了自动地创建索引。这是故意这样做的,是为了该命令尽可能地灵活。如果你希望在创建表时同时创建索引,你必须在 <CODE>SELECT</CODE> 语句之前指定它们:


<PRE>
mysql&#62; CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
</PRE>

如果在拷贝数据到表中时发生任何错误,数据将被自动地删除。

为了确保更新日志/二进制日志可用于重建最初的表,在 <CODE>CREATE TABLE ... SELECT</CODE> 过程中,MySQL 不允许并发的插入。

<P></P>

<LI>
在不支持大文件的操作系统上,<CODE>RAID_TYPE</CODE> 选项可以帮助你打破 MyISAM 数据文件(非索引文件)的 2G/4G 限止。注意,这个选项在支持大文件的文件系统上不推荐使用!

将 <CODE>RAID</CODE> 目录放在不同的物理磁盘上,可以通过 I/O 瓶颈得到更高的速度。<CODE>RAID_TYPE</CODE> 可以在任何操作系统上工作,只要你配置 MySQL <CODE>--with-raid</CODE>。
目前 <CODE>RAID_TYPE</CODE> 只允许 <CODE>STRIPED</CODE> (<CODE>1</CODE> 和 <CODE>RAID0</CODE> 是它的别名)。

⌨️ 快捷键说明

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