2012-08-09 272 views
7

看着心爱的W3schools,发现这page,实际上学到了一些有趣的东西。我不知道你可以在不指定列值的情况下调用插入命令。例如;SQL INSERT没有指定列。怎么了?

INSERT INTO table_name 
VALUES (value1, value2, value3,...) 

从我朦胧的记忆拉,我似乎记得SQL教授提的是,你有,如果他们是不以任何特定的顺序处理领域(尽管在RDB的一面,但它不能保证) 。

我的问题是,服务器如何知道哪些值被分配到哪些字段?*我会自己测试这个,但是不打算使用生产服务器来执行哪一个是我现在可以访问的。

如果这项技术具体,我正在研究PostgresSQL。这个特别的语法如何有用?

回答

6

你的教授是对的 - 你应该在命名这些值之前明确命名这些列。

在这种情况下,尽管按照它们出现在表格定义中的顺序插入值。

这样做的问题是,如果该顺序发生更改,或者列被删除或添加(即使它们可以为空),则插入将会中断。

就其用处而言,在生产代码中没有那么多。如果您手动编写快速插入代码,那么它可能会帮助您节省您输入的所有列名称。

3

它们按照它们在表格定义中的顺序插入到字段中。所以如果你的表有字段(a,b,c),a = value1,b = value2,c = value3。

你的教授说得对,这是懒惰的,容易打破。但对于快速而脏的懒惰插入很有用。

0

这些值只是按列出现在表中的顺序添加。当你不知道你正在使用的列的名字,但知道需要进入哪些数据时,这很有用。通常这不是一个好主意,但是如果列的顺序当然会中断中间插入更改或新列。

0

只有当您提供与列数相同数量的值时,该语法才能在未指定列的情况下工作。第二个更重要的是sql表中的列总是以相同的顺序并且取决于你的表定义。在sql表中没有固有顺序的唯一东西是行。

0

当创建表时,每列将在系统表中有一个订单号。所以,每个值将插入按顺序..

Firt值会去第一列...的等等

SQL Server中,系统表SYSCOLUMN维持这个顺序。 Postgresql应该有类似的东西..

2

我无法抗拒把“RTFM”放在这里。
PostgreSQL的手工细节发生了什么in the chapter on INSERT

目标列名可以任意顺序列出。如果根本没有列出 列名,默认为 表的所有列以其声明的顺序排列;或第一个N列名,如果有 只有N列由VALUES子句提供或查询。由VALUES子句或查询提供的值 与显式或隐式列表列表从左到右相关联。

大胆重视我的。