Answers:
据我所知,这两种语法都是等效的。第一个是SQL标准,第二个是MySQL的扩展。
因此,它们应该在性能上完全等效。
http://dev.mysql.com/doc/refman/5.6/en/insert.html说:
INSERT将新行插入到现有表中。语句的INSERT ... VALUES和INSERT ... SET形式根据明确指定的值插入行。INSERT ... SELECT表单插入从另一个表或多个表中选择的行。
INSERT INTO table SET
?这有可能吗?
我认为该扩展旨在允许插入和更新使用类似的语法。在Oracle中,一个类似的语法技巧是:
UPDATE table SET (col1, col2) = (SELECT val1, val2 FROM dual)
INSERT ... SET ...
和INSERT ... VALUES ...
。对于此功能,您拥有更短,更快速的代码编写,更高的可读性以及消除了在编写VALUES
子句时由于混合列顺序而导致的拼写错误。我的直觉告诉我,网络上的好事大于坏事,但您的判断可能有所不同。
因为语法是等效的(无论如何在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
语法似乎并不起作用,而另一条语法可以。但是在大多数实际情况下,尽管有可能在某些情况下构造一个大型查询以在一个查询中向表中插入一堆行,但您可能会遍历一组记录以进行插入操作,而在某些情况下每行,可能会提高性能。真的不知道
INSERT INTO table SET
是这不是标准的。似乎更清楚了。我想我还是必须使用INSERT INTO table ([column name, column name b]) VALUES (['value a', 'value b'])
语法,但是如果我移植到Postgres可以避免麻烦。