DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) delete

Info Catalog (mysql.info) data-manipulation (mysql.info) data-manipulation (mysql.info) do
 
 13.2.1 `DELETE' Syntax
 ----------------------
 
 Single-table syntax:
 
      DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM TBL_NAME
          [WHERE WHERE_CONDITION]
          [ORDER BY ...]
          [LIMIT ROW_COUNT]
 
 Multiple-table syntax:
 
      DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
          TBL_NAME[.*] [, TBL_NAME[.*]] ...
          FROM TABLE_REFERENCES
          [WHERE WHERE_CONDITION]
 
 Or:
 
      DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
          FROM TBL_NAME[.*] [, TBL_NAME[.*]] ...
          USING TABLE_REFERENCES
          [WHERE WHERE_CONDITION]
 
 For the single-table syntax, the `DELETE' statement deletes rows from
 TBL_NAME and returns the number of rows deleted. The `WHERE' clause, if
 given, specifies the conditions that identify which rows to delete.
 With no `WHERE' clause, all rows are deleted. If the `ORDER BY' clause
 is specified, the rows are deleted in the order that is specified. The
 `LIMIT' clause places a limit on the number of rows that can be deleted.
 
 For the multiple-table syntax, `DELETE' deletes from each TBL_NAME the
 rows that satisfy the conditions. In this case, `ORDER BY' and `LIMIT'
 cannot be used.
 
 WHERE_CONDITION is an expression that evaluates to true for each row to
 be deleted. It is specified as described in  select.
 
 As stated, a `DELETE' statement with no `WHERE' clause deletes all
 rows. A faster way to do this, when you do not want to know the number
 of deleted rows, is to use `TRUNCATE TABLE'. See  truncate.
 
 If you delete the row containing the maximum value for an
 `AUTO_INCREMENT' column, the value is reused later for a `BDB' table,
 but not for a `MyISAM' or `InnoDB' table. If you delete all rows in the
 table with `DELETE FROM TBL_NAME' (without a `WHERE' clause) in
 `AUTOCOMMIT' mode, the sequence starts over for all storage engines
 except `InnoDB' and `MyISAM'. There are some exceptions to this
 behavior for `InnoDB' tables, as discussed in 
 innodb-auto-increment-column.
 
 For `MyISAM' and `BDB' tables, you can specify an `AUTO_INCREMENT'
 secondary column in a multiple-column key. In this case, reuse of values
 deleted from the top of the sequence occurs even for `MyISAM' tables.
 See  example-auto-increment.
 
 The `DELETE' statement supports the following modifiers:
 
    * If you specify `LOW_PRIORITY', the server delays execution of the
      `DELETE' until no other clients are reading from the table.
 
    * For `MyISAM' tables, if you use the `QUICK' keyword, the storage
      engine does not merge index leaves during delete, which may speed
      up some kinds of delete operations.
 
    * The `IGNORE' keyword causes MySQL to ignore all errors during the
      process of deleting rows. (Errors encountered during the parsing
      stage are processed in the usual manner.) Errors that are ignored
      due to the use of `OPTION' are returned as warnings.
 
 The speed of delete operations may also be affected by factors
 discussed in  delete-speed.
 
 In `MyISAM' tables, deleted rows are maintained in a linked list and
 subsequent `INSERT' operations reuse old row positions. To reclaim
 unused space and reduce file sizes, use the `OPTIMIZE TABLE' statement
 or the `myisamchk' utility to reorganize tables. `OPTIMIZE TABLE' is
 easier, but `myisamchk' is faster. See  optimize-table, and
  myisamchk.
 
 The `QUICK' modifier affects whether index leaves are merged for delete
 operations. `DELETE QUICK' is most useful for applications where index
 values for deleted rows are replaced by similar index values from rows
 inserted later. In this case, the holes left by deleted values are
 reused.
 
 `DELETE QUICK' is not useful when deleted values lead to underfilled
 index blocks spanning a range of index values for which new inserts
 occur again. In this case, use of `QUICK' can lead to wasted space in
 the index that remains unreclaimed. Here is an example of such a
 scenario:
 
   1. Create a table that contains an indexed `AUTO_INCREMENT' column.
 
   2. Insert many rows into the table. Each insert results in an index
      value that is added to the high end of the index.
 
   3. Delete a block of rows at the low end of the column range using
      `DELETE QUICK'.
 
 In this scenario, the index blocks associated with the deleted index
 values become underfilled but are not merged with other index blocks
 due to the use of `QUICK'. They remain underfilled when new inserts
 occur, because new rows does not have index values in the deleted
 range. Furthermore, they remain underfilled even if you later use
 `DELETE' without `QUICK', unless some of the deleted index values
 happen to lie in index blocks within or adjacent to the underfilled
 blocks. To reclaim unused index space under these circumstances, use
 `OPTIMIZE TABLE'.
 
 If you are going to delete many rows from a table, it might be faster
 to use `DELETE QUICK' followed by `OPTIMIZE TABLE'. This rebuilds the
 index rather than performing many index block merge operations.
 
 The MySQL-specific `LIMIT ROW_COUNT' option to `DELETE' tells the
 server the maximum number of rows to be deleted before control is
 returned to the client.  This can be used to ensure that a given
 `DELETE' statement does not take too much time.  You can simply repeat
 the `DELETE' statement until the number of affected rows is less than
 the `LIMIT' value.
 
 If the `DELETE' statement includes an `ORDER BY' clause, the rows are
 deleted in the order specified by the clause. This is really useful
 only in conjunction with `LIMIT'. For example, the following statement
 finds rows matching the `WHERE' clause, sorts them by
 `timestamp_column', and deletes the first (oldest) one:
 
      DELETE FROM somelog WHERE user = 'jcole'
      ORDER BY timestamp_column LIMIT 1;
 
 You can specify multiple tables in a `DELETE' statement to delete rows
 from one or more tables depending on the particular condition in the
 `WHERE' clause.  However, you cannot use `ORDER BY' or `LIMIT' in a
 multiple-table `DELETE'. The TABLE_REFERENCES clause lists the tables
 involved in the join. Its syntax is described in  join.
 
 For the first multiple-table syntax, only matching rows from the tables
 listed before the `FROM' clause are deleted. For the second
 multiple-table syntax, only matching rows from the tables listed in the
 `FROM' clause (before the `USING' clause) are deleted.  The effect is
 that you can delete rows from many tables at the same time and have
 additional tables that are used only for searching:
 
      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;
 
 These statements use all three tables when searching for rows to
 delete, but delete matching rows only from tables `t1' and `t2'.
 
 The preceding examples show inner joins that use the comma operator,
 but multiple-table `DELETE' statements can use any type of join allowed
 in `SELECT' statements, such as `LEFT JOIN'.
 
 The syntax allows `.*' after the table names for compatibility with
 `Access'.
 
 If you use a multiple-table `DELETE' statement involving `InnoDB'
 tables for which there are foreign key constraints, the MySQL optimizer
 might process tables in an order that differs from that of their
 parent/child relationship. In this case, the statement fails and rolls
 back.  Instead, you should delete from a single table and rely on the
 `ON DELETE' capabilities that `InnoDB' provides to cause the other
 tables to be modified accordingly.
 
 * If you provide an alias for a table, you must use the alias
 when referring to the table:
 
      DELETE t1 FROM test AS t1, test2 WHERE ...
 
 Cross-database deletes are supported for multiple-table deletes, but in
 this case, you must refer to the tables without using aliases. For
 example:
 
      DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
 
 Currently, you cannot delete from a table and select from the same
 table in a subquery.
 
Info Catalog (mysql.info) data-manipulation (mysql.info) data-manipulation (mysql.info) do
automatically generated byinfo2html