MySQL 4.1.0 中文参考手册 --- 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE[8]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shuixin13 的 blog

仅仅在 fromusing 子句 之前 列出的表中的匹配记录行被删除。效果就是,你要以从多个表中同时删除记录行,并且同样可以有其它的表用于检索。

在表名后的 .* 仅仅是为了兼容 access

delete t1,t2 from t1,t2,t3 where t1.id=t2.id and t2.id=t3.id
or
delete from t1,t2 using t1,t2,t3 where t1.id=t2.id and t2.id=t3.id

在上面的情况下,我们仅仅从 t1t2 表中删除匹配的记录行。

如果一个 order by 子句被使用(从 mysql 4.0.0 开始支持), 记录行将以指定的次序删除。这实际上只有连同 limit 一起才有用。示例如下:

delete from somelog
where user = 'jcole'
order by timestamp
limit 1

这将删除匹配 where 子句的,并且最早被插入(通过 timestamp 来确定)的记录行。

delete 语句的limit rows 选项是 mysql 特有的,它告诉服务器在控制权被返回到客户端之前可被删除的最大记录行数目。这可以用来确保一个特定的 delete 命令不会占用太长的时间。你可以简单地重复使用 delete 命令,直到被影响的记录行数目小于 limit 值。

从 mysql 4.0 开始,在 delete 语句中可以指定多个表,用以从一个表中删除依赖于多表中的特殊情况的记录行。然而,在一个多表删除中,不能使用 order bylimit

6.4.7 truncate 句法

truncate table table_name

在 3.23 中,truncate table 被映射为 commit ; delete from table_name。查看章节 6.4.6 delete 句法

在下面的方式中,truncate table 不同于 delete from ...

  • 删简操作撤销并重建表,这将比一个接一个地删除记录行要快得多。
  • 非事务安全的;如果存在一个活动的事务或一个有效的表锁定,你将会得到一个错误。
  • 不返回删除了的记录行数目。
  • 只要表定义文件 `table_name.frm' 是有效的,即使数据或索引文件已经被损坏,也可以通过这种方式重建表。

truncate 是一个 oracle sql 的扩展。

6.4.8 replace句法

    replace [low_priority | delayed]
        [into] tbl_name [(col_name,...)]
        values (expression,...),(...),...
or  replace [low_priority | delayed]
        [into] tbl_name [(col_name,...)]
        select ...
or  replace [low_priority | delayed]
        [into] tbl_name
        set col_name=expression, col_name=expression,...

replace 功能与 insert 完全一样,除了如果在表中存在一个老的记录与新记录在一个 uniqueprimary key 上有相同的值,那么在新记录被插入之前,老的记录将被删除。查看章节 6.4.3 insert 句法

换句话说,你不可以从一个 replace 中访问老的记录行的值。某些老的 mysql 版本中,你或许可以这样做,但是这是一个 bug,现在已被修正了。

为了能够使用 replace,你必须有对该表的 insertdelete 权限。

当你使用一个 replace 时,如果新的记录行代替了老的记录行,mysql_affected_rows() 将返回 2。这是因为在新行被插入之前,重复记录行被先删除了。

这个事实使得判断 replace 是否是添加一条记录还是替换一条记录很容易:检查受影响记录行的值是 1 (添加)还是 2(替换)。

注意,除非你使用一个 unique 索引或 primary key ,使用 replace 命令是没有感觉的,因为它会仅仅执行一个 insert

6.4.9 load data infile 句法

load data [low_priority | concurrent] [local] infile 'file_name.txt'
    [replace | ignore]
    into table tbl_name
    [fields
        [terminated by '\t']
        [[optionally] enclosed by '']
        [escaped by '\\' ]
    ]
    [lines terminated by '\n']
    [ignore number lines]
    [(col_name,...)]

load data infile 语句以非常高的速度从一个文本文件中读取记录行并插入到一个表中。如果 local 关键词被指定,文件从客户端主机读取。如果 local 没有被指定,文件必须位于服务器上。(local 在 mysql 3.22.6 或更新的版本中被支持。)

由于安全性的原因,当读取位于服务器端的文本文件时,文件必须处于数据库目录或可被所有人读取的地方。同时,为了对服务器端的文件使用 load data infile,你必须在服务器主机上有 file 权限。查看章节 4.2.7 由 mysql 提供的权限

在 mysql 3.23.49 和 mysql 4.0.2 中,只有当你没有以 --local-infile=0 选项启动 mysqld,或你没有禁止你的客户端程序支持 local的情况下,local 才会工作。查看章节 4.2.4 load data local 的安全性问题.

如果你指定关键词 low_priorityload data 语句的执行将会被延迟,直到没有其它的客户端正在读取表。

如果你对一个 myisam 表指定关键词 concurrent,那么当 load data正在执行时,其它的线程仍可以从表中检索数据。使用这个选项时,如果同时也有其它的线程正在使用表,这当然会有一点影响 load data 的执行性能。

使用 local 将比让服务器直接访问文件要慢一些,因为文件的内容必须从客户端主机传送到服务器主机。而在另一方面,你不再需要有 file 权限用于装载本地文件。

如果你使用先于 mysql 3.23.24 的版本,你不能够以 load data infile 读取一个 fifo 。如果你需要从一个 fifo (例如,gunzip 的输出文件) 中读取,可以使用 load data local infile 代替。

你也可以使用 mysqlimport 实用程序装载数据文件;它通过发送一个 load data infile 命令到服务器来动作。--local 选项使得 mysqlimport 从客户端主机读取数据文件。如果客户端与服务器支持压缩协议,你可以指定 --compress 选项,以在较慢的网络中获得更好的性能。

本文关键:MySQL 4.1.0 中文
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top