【问题标题】:MySQL INSERT INTO table VALUES.. vs INSERT INTO table SETMySQL INSERT INTO table VALUES.. vs INSERT INTO table SET
【发布时间】:2010-10-26 02:13:10
【问题描述】:

INSERT INTO table VALUES ..INSERT INTO table SET 之间的主要区别是什么?

例子:

INSERT INTO table (a, b, c) VALUES (1,2,3)

INSERT INTO table SET a=1, b=2, c=3

这两者的表现如何?

【问题讨论】:

  • 在阅读了 Code Complete 和 McConnell 对可读性的不断强调之后,很遗憾INSERT INTO table SET 不是标准的。似乎清晰了许多。我想无论如何我都必须使用INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b']) 语法,但如果我移植到 Postgres 可以避免麻烦。

标签: sql mysql performance


【解决方案1】:

由于语法是等效的(无论如何在 MySQL 中),我更喜欢 INSERT INTO table SET x=1, y=2 语法,因为它更容易修改并且更容易在语句中捕获错误,尤其是在插入大量列时。如果您必须插入 10 或 15 或更多列,我认为使用 (x, y) VALUES (1,2) 语法很容易混淆。

如果不同 SQL 标准之间的可移植性是一个问题,那么可能会首选INSERT INTO table (x, y) VALUES (1,2)

如果您想在单个查询中插入多条记录,INSERT INTO ... SET 语法似乎不起作用,而另一种语法则可以。但是在大多数实际情况下,无论如何,您都会遍历一组记录以进行插入,尽管在某些情况下,可能会构造一个大型查询以在一个查询中将一堆行插入到一个表中,而不是一个查询每一行,可能会有性能提升。真的不知道。

【讨论】:

    【解决方案2】:

    我认为该扩展旨在允许插入和更新的类似语法。在 Oracle 中,类似的语法技巧是:

    UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
    

    【讨论】:

    • @Pacerier 比如?我看到的唯一问题是可移植性问题(在许多情况下并不重要);我错过了什么吗?
    • @MarkAmery,是的,当您查看它时,并没有真正的好处。缺点是浪费了不必要的时间,这个线程的整个存在证明了我的观点。
    • @Pacerier 我不确定我是否明白你的意思?浪费了多少时间?有一个好处,已经被指出:您只需要循环一次键/值对数组来创建您的 INSERT 语句,而不是使用 VALUES 语法所需的两次,这会导致更短、更清晰,以及编写速度更快的代码。
    • @MarkAmery 但是这个预言机技巧没有那个好处。您首先命名所有列,然后是所有值。
    • @Pacerier 这是一个公平的观点,需要权衡取舍。针对该功能,您会遇到可移植性问题并且浪费时间研究INSERT ... SET ...INSERT ... VALUES ... 之间的区别。对于该功能,您的代码更短、编写速度更快、可读性更高,并且消除了在编写VALUES 子句时由于混淆列顺序而导致的拼写错误。我的直觉告诉我,在网络上,好事多于坏事,但您的判断可能会有所不同。
    【解决方案3】:

    据我所知,这两种语法是等价的。第一个是SQL标准,第二个是MySQL的扩展。

    因此,它们在性能方面应该完全相同。

    http://dev.mysql.com/doc/refman/5.6/en/insert.html 说:

    INSERT 将新行插入到现有表中。语句的 INSERT ... VALUES 和 INSERT ... SET 形式根据显式指定的值插入行。 INSERT ... SELECT 表单插入从另一个或多个表中选择的行。

    【讨论】:

    • 如何使用INSERT INTO table SET 插入多个值?这甚至可能吗?
    • 什么意思? OP 的示例说 SET a=1, b=2, c=3 在我的理解中是多个值。
    • 我的意思是,插入多行。像:INSERT INTO table (a, b, c) VALUES (1,2,3), (4,5,6), (7,8,9);
    • 只有使用 VALUES 语法的 INSERT 语句才能插入多行。
    • @VinkoVrsalovic,不正确,insert select也可以在选择多行时插入多行
    猜你喜欢
    • 2012-07-06
    • 2011-11-09
    • 2015-04-12
    • 2023-02-09
    • 2020-06-07
    • 1970-01-01
    • 2011-12-04
    • 2014-05-12
    • 2023-03-18
    相关资源
    最近更新 更多