ZetCode

MySQL 插入,更新和删除

最后修改于 2023 年 1 月 10 日

在本 MySQL 教程中,我们将从 MySQL 表中插入,更新和删除数据。我们将使用 INSERT, DELETEUPDATE 语句。这些语句是 SQL 数据操作语言 (DML) 的一部分。

插入数据

INSERT 语句用于将数据插入到表中。

我们将创建一个新表,在其中进行示例。

mysql> CREATE TABLE Books(Id INTEGER PRIMARY KEY, Title VARCHAR(100),
    -> Author VARCHAR(60));

我们创建一个新表 Books,具有 IdTitleAuthor 列。

mysql> INSERT INTO Books(Id, Title, Author) VALUES(1, 'War and Peace', 
    -> 'Leo Tolstoy');

这是经典的 INSERT SQL 语句。我们在表名后指定了所有列名,并在 VALUES 关键字后指定了所有值。我们将第一行添加到表中。

mysql> SELECT * FROM Books;
+----+---------------+-------------+
| Id | Title         | Author      |
+----+---------------+-------------+
|  1 | War and Peace | Leo Tolstoy |
+----+---------------+-------------+

我们将第一行插入到 Books 表中。

mysql> INSERT INTO Books(Title, Author) VALUES ('The Brothers Karamazov',
    -> 'Fyodor Dostoyevsky');

我们在 Books 表中添加一个新标题。我们省略了 Id 列。Id 列具有 AUTO_INCREMENT 属性。这意味着 MySQL 将自动增加 Id 列。AUTO_INCREMENT 列递增的值由 auto_increment_increment 系统变量控制。默认情况下,它是 1。

mysql> SELECT * FROM Books;
+----+------------------------+--------------------+
| Id | Title                  | Author             |
+----+------------------------+--------------------+
|  1 | War and Peace          | Leo Tolstoy        |
|  2 | The Brothers Karamazov | Fyodor Dostoyevsky |
+----+------------------------+--------------------+

这是我们在 Books 表中的内容。

mysql> INSERT INTO Books VALUES(3, 'Crime and Punishment',
    -> 'Fyodor Dostoyevsky');

在此 SQL 语句中,我们没有在表名后指定任何列名。在这种情况下,我们必须提供所有值。

mysql> REPLACE INTO Books VALUES(3, 'Paradise Lost', 'John Milton');
Query OK, 2 rows affected (0.00 sec)

REPLACE 语句是 SQL 标准的 MySQL 扩展。如果与现有行冲突,它会插入新行或替换旧行。在我们的表中,有一行 Id=3。因此,我们之前的语句用新行替换了它。有一条消息说有两行受到影响。一行被删除,一行被插入。

mysql> SELECT * FROM Books WHERE Id=3;
+----+---------------+-------------+
| Id | Title         | Author      |
+----+---------------+-------------+
|  3 | Paradise Lost | John Milton |
+----+---------------+-------------+

这就是我们现在在第三列中的内容。

我们可以在一个语句中使用 INSERTSELECT 语句。

mysql> CREATE TABLE Books2(Id INTEGER PRIMARY KEY AUTO_INCREMENT, 
    -> Title VARCHAR(100), Author VARCHAR(60)) type=MEMORY;

首先,我们在内存中创建一个名为 Books2 的临时表。

mysql> INSERT INTO Books2 SELECT * FROM Books;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

在这里,我们将从 Books 表中选择的所有数据插入到 Books2 中。

mysql> SELECT * FROM Books2;
+----+------------------------+--------------------+
| Id | Title                  | Author             |
+----+------------------------+--------------------+
|  1 | War and Peace          | Leo Tolstoy        |
|  2 | The Brothers Karamazov | Fyodor Dostoyevsky |
|  3 | Paradise Lost          | John Milton        |
+----+------------------------+--------------------+

我们验证一下。一切正常。

mysql> INSERT INTO Books(Title, Author) VALUES ('The Insulted and Humiliated',
    -> 'Fyodor Dostoyevsky'), ('Cousin Bette', 'Honore de Balzac');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

我们可以使用 INSERT 语句向表中插入多行。这里我们展示了如何操作。

我们可以从文件系统中插入数据。首先,我们将数据从 Books 表转储到 books.csv 文件中。

mysql> SELECT * INTO OUTFILE '/tmp/books.csv'
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY '\n'
    -> FROM Books;

我们将数据从 Books 表写入 books.csv 文件。数据将采用 CSV 格式。

$ cat /tmp/books.csv 
1,War and Peace,Leo Tolstoy
2,The Brothers Karamazov,Fyodor Dostoyevsky
3,Paradise Lost,John Milton
4,The Insulted and Humiliated,Fyodor Dostoyevsky
5,Cousin Bette,Honore de Balzac

我们显示 books.csv 文件的内容。

mysql> TRUNCATE Books;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM Books;
Empty set (0.00 sec)

我们从表中删除所有数据。

mysql> LOAD DATA INFILE '/tmp/books.csv'    
    -> INTO TABLE Books    
    -> FIELDS TERMINATED BY ','    
    -> LINES TERMINATED BY '\n';

我们使用 LOAD DATA INFILE 语法从 books.csv 文件填充 Books 表。

mysql> SELECT * FROM Books;
+----+-----------------------------+--------------------+
| Id | Title                       | Author             |
+----+-----------------------------+--------------------+
|  1 | War and Peace               | Leo Tolstoy        |
|  2 | The Brothers Karamazov      | Fyodor Dostoyevsky |
|  3 | Paradise Lost               | John Milton        |
|  4 | The Insulted and Humiliated | Fyodor Dostoyevsky |
|  5 | Cousin Bette                | Honore de Balzac   |
+----+-----------------------------+--------------------+

一切正常。

我们也可以从 XML 文件中加载数据。首先,我们将数据从 Books 表写入 XML 文件。

$ mysql -uroot -p --xml -e 'SELECT * FROM mydb.Books' > books.xml

mysql 监视器有一个 --xml 选项,它使我们能够以 XML 格式转储数据。-e 选项执行一个语句并退出监视器。

$ cat books.xml 
<?xml version="1.0"?>

<resultset statement="SELECT * FROM mydb.Books
" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
    <field name="Id">1</field>
    <field name="Title">War and Peace</field>
    <field name="Author">Leo Tolstoy</field>
  </row>

  <row>
    <field name="Id">2</field>
    <field name="Title">The Brothers Karamazov</field>
    <field name="Author">Fyodor Dostoyevsky</field>
  </row>

  <row>
    <field name="Id">3</field>
    <field name="Title">Paradise Lost</field>
    <field name="Author">John Milton</field>
  </row>

  <row>
    <field name="Id">4</field>
    <field name="Title">The Insulted and Humiliated</field>
    <field name="Author">Fyodor Dostoyevsky</field>
  </row>

  <row>
    <field name="Id">5</field>
    <field name="Title">Cousin Bette</field>
    <field name="Author">Honore de Balzac</field>
  </row>
</resultset>

这是我们的 XML 文件。

mysql> LOAD XML INFILE '/home/vronskij/programming/mysql/books.xml' INTO TABLE Books;

我们从 XML 文件中加载数据。请注意,LOAD XML 语句适用于 MySQL 5.5 及更高版本。

删除数据

在 MySQL 中,我们可以使用 DELETETRUNCATE 语句删除数据。TRUNCATE 语句是 SQL 规范的 MySQL 扩展。首先,我们将从表中删除一行。我们将使用之前创建的 Books2 表。

mysql> DELETE FROM Books2 WHERE Id=1;

我们删除 Id=1 的行。

mysql> SELECT * FROM Books2;
+----+------------------------+--------------------+
| Id | Title                  | Author             |
+----+------------------------+--------------------+
|  2 | The Brothers Karamazov | Fyodor Dostoyevsky |
|  3 | Paradise Lost          | John Milton        |
+----+------------------------+--------------------+

我们验证数据。

mysql> DELETE FROM Books2;
mysql> TRUNCATE Books2;

这两个 SQL 语句删除表中的所有数据。

更新数据

UPDATE 语句用于更改表中选定行的列的值。

mysql> SELECT * FROM Books;
+----+-----------------------------+--------------------+
| Id | Title                       | Author             |
+----+-----------------------------+--------------------+
|  1 | War and Peace               | Leo Tolstoy        |
|  2 | The Brothers Karamazov      | Fyodor Dostoyevsky |
|  3 | Paradise Lost               | John Milton        |
|  4 | The Insulted and Humiliated | Fyodor Dostoyevsky |
|  5 | Cousin Bette                | Honore de Balzac   |
+----+-----------------------------+--------------------+

我们重新创建 Books 表。这些是行。

假设我们想将“Leo Tolstoy”更改为“Lev Nikolayevich Tolstoy”表。以下语句显示了如何实现此目的。

mysql> UPDATE Books SET Author='Lev Nikolayevich Tolstoy'
    -> WHERE Id=1;

SQL 语句将 author 列设置为“Lev Nikolayevich Tolstoy”,对于 Id=1 的列。

mysql> SELECT * FROM Books WHERE Id=1;
+----+---------------+--------------------------+
| Id | Title         | Author                   |
+----+---------------+--------------------------+
|  1 | War and Peace | Lev Nikolayevich Tolstoy |
+----+---------------+--------------------------+

该行已正确更新。

在本 MySQL 教程中,我们插入,删除了数据库表中的数据并进行了更新。