MySQL INSERT INTO表VALUES .. vs INSERT INTO表SET


252

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

那这两个的性能如何?


12
在阅读了Code Complete和McConnell对可读性的一贯强调之后,似乎不幸的INSERT INTO table SET是这不是标准的。似乎更清楚了。我想我还是必须使用INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])语法,但是如果我移植到Postgres可以避免麻烦。
cluelesscoder

Answers:


195

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

因此,它们应该在性能上完全等效。

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

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


4
如何使用插入多个值INSERT INTO table SET?这有可能吗?
pixelfreak 2012年

2
你什么意思?OP举例说明SET a = 1,b = 2,c = 3,根据我的理解,这是多个值。
Vinko Vrsalovic

9
我的意思是,插入多行。就像:INSERT INTO表(a,b,c)值(1,2,3),(4,5,6),(7,8,9);
pixelfreak 2012年

5
只有使用VALUES语法的INSERT语句才能插入多行。
Vinko Vrsalovic

8
@VinkoVrsalovic,不是真的,插入选择还可以在选择多行时插入多行
Pacerier 2012年

15

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

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

5
@Pacerier如?我看到的唯一问题是可移植性(在许多情况下这并不重要)。我错过了什么吗?
Mark Amery 2013年

1
@MarkAmery,是的,没什么真正的好处。缺点是浪费了不必要的时间,这个线程的全部存在证明了我的观点。
Pacerier 2013年

8
@Pacerier我不确定我是否明白你的意思?什么时间浪费了?已经指出了一个好处:只需要一次遍历键/值对数组就可以创建INSERT语句,而不是像使用VALUES语法那样需要遍历两次,这将导致更短,更清晰,以及编写速度更快的代码。
Mark Amery

@MarkAmery但甲骨文招不具有该益处。您首先命名所有列,然后命名所有值。
hobbs

12
@Pacerier这是一个公平的观点,需要权衡取舍。对功能,您有便携性的问题,浪费时间研究之间的差异INSERT ... SET ...INSERT ... VALUES ...。对于此功能,您拥有更短,更快速的代码编写,更高的可读性以及消除了在编写VALUES子句时由于混合列顺序而导致的拼写错误。我的直觉告诉我,网络上的好事大于坏事,但您的判断可能有所不同。
Mark Amery 2014年

4

因为语法是等效的(无论如何在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语法似乎并不起作用,而另一条语法可以。但是在大多数实际情况下,尽管有可能在某些情况下构造一个大型查询以在一个查询中向表中插入一堆行,但您可能会遍历一组记录以进行插入操作,而在某些情况下每行,可能会提高性能。真的不知道

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.