本文介绍如何利用 SQL 的INSERT语句将数据插入表中。1. 数据插入顾名思义INSERT用来将行插入或添加到数据库表。插入有几种方式插入完整的行插入行的一部分插入某些查询的结果。下面逐一介绍这些内容。1.1 插入完整的行把数据插入表中的最简单方法是使用基本的INSERT语法它要求指定表名和插入到新行中的值。下面举一个例子INSERT INTO Customers VALUES(1000000006, Toy Land, 123 Any Street, New York, NY, 11111, USA, NULL, NULL);分析这个例子将一个新顾客插入到Customers表中。存储到表中每一列的数据在VALUES子句中给出必须给每一列提供一个值。如果某列没有值如上面的cust_contact和cust_email列则应该使用NULL值假定表允许对该列指定空值。各列必须以它们在表定义中出现的次序填充。提示INTO关键字在某些 SQL 实现中跟在INSERT之后的INTO关键字是可选的。但是即使不一定需要最好还是提供这个关键字这样做将保证 SQL 代码在 DBMS 之间可移植。虽然这种语法很简单但并不安全应该尽量避免使用。上面的 SQL 语句高度依赖于表中列的定义次序还依赖于其容易获得的次序信息。即使可以得到这种次序信息也不能保证各列在下一次表结构变动后保持完全相同的次序。因此编写依赖于特定列次序的 SQL 语句是很不安全的这样做迟早会出问题。编写INSERT语句的更安全不过更烦琐的方法如下INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES(1000000006, Toy Land, 123 Any Street, New York, NY, 11111, USA, NULL, NULL);分析这个例子与前一个INSERT语句的工作完全相同但在表名后的括号里明确给出了列名。在插入行时DBMS 将用VALUES列表中的相应值填入列表中的对应项。VALUES中的第一个值对应于第一个指定列名第二个值对应于第二个列名如此等等。因为提供了列名VALUES必须以其指定的次序匹配指定的列名不一定按各列出现在表中的实际次序。其优点是即使表的结构改变这条INSERT语句仍然能正确工作。说明不能插入同一条记录两次如果你尝试了这个例子的两种方法会发现第二次生成了一条出错消息说 ID 为1000000006的顾客已经存在。在第一课我们说过主键的值必须有唯一性而cust_id是主键DBMS 不允许插入相同cust_id值的新行。下面的INSERT语句填充所有列与前面的一样但以一种不同的次序填充。因为给出了列名所以插入结果仍然正确INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip) VALUES(1000000006, NULL, NULL, Toy Land, 123 Any Street, New York, NY, 11111);提示总是使用列的列表不要使用没有明确给出列的INSERT语句。给出列能使 SQL 代码继续发挥作用即使表结构发生了变化。注意小心使用VALUES不管使用哪种INSERT语法VALUES的数目都必须正确。如果不提供列名则必须给每个表列提供一个值如果提供列名则必须给列出的每个列一个值。否则就会产生一条错误消息相应的行不能成功插入。1.2 插入部分行正如所述使用INSERT的推荐方法是明确给出表的列名。使用这种语法还可以省略列这表示可以只给某些列提供值给其他列不提供值。请看下面的例子INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES(1000000006, Toy Land, 123 Any Street, New York, NY, 11111, USA);分析在前面的例子中没有给cust_contact和cust_email这两列提供值。这表示没必要在INSERT语句中包含它们。因此这里的INSERT语句省略了这两列及其对应的值。注意省略列如果表的定义允许则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件该列定义为允许NULL值无值或空值。在表定义中给出默认值。这表示如果不给出值将使用默认值。注意省略所需的值如果表中不允许有NULL值或者默认值这时却省略了表中的值DBMS 就会产生错误消息相应的行不能成功插入。1.3 插入检索出的数据INSERT一般用来给表插入具有指定列值的行。INSERT还存在另一种形式可以利用它将SELECT语句的结果插入表中这就是所谓的INSERT SELECT。顾名思义它是由一条INSERT语句和一条SELECT语句组成的。假如想把另一表中的顾客列合并到Customers表中不需要每次读取一行再将它用INSERT插入可以如下进行INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) SELECT cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country FROM CustNew;说明新例子的说明这个例子从一个名为CustNew的表中读出数据并插入到Customers表。为了试验这个例子应该首先创建和填充CustNew表。CustNew表的结构与Customers表相同。在填充CustNew时不应该使用已经在Customers中用过的cust_id值如果主键值重复后续的INSERT操作将会失败。分析这个例子使用INSERT SELECT从CustNew中将所有数据导入Customers。SELECT语句从CustNew检索出要插入的值而不是列出它们。SELECT中列出的每一列对应于Customers表名后所跟的每一列。这条语句将插入多少行呢这依赖于CustNew表有多少行。如果这个表为空则没有行被插入也不产生错误因为操作仍然是合法的。如果这个表确实有数据则所有数据将被插入到Customers。提示INSERT SELECT中的列名为简单起见这个例子在INSERT和SELECT语句中使用了相同的列名。但是不一定要求列名匹配。事实上DBMS 一点儿也不关心SELECT返回的列名。它使用的是列的位置因此SELECT中的第一列不管其列名将用来填充表列中指定的第一列第二列将用来填充表列中指定的第二列如此等等。INSERT SELECT中SELECT语句可以包含WHERE子句以过滤插入的数据。提示插入多行INSERT通常只插入一行。要插入多行必须执行多个INSERT语句。INSERT SELECT是个例外它可以用一条INSERT插入多行不管SELECT语句返回多少行都将被INSERT插入。2. 从一个表复制到另一个表有一种数据插入不使用INSERT语句。要将一个表的内容复制到一个全新的表运行中创建的表可以使用CREATE SELECT语句或者在 SQL Server 里也可用SELECT INTO语句。说明DB2 不支持DB2 不支持这里描述的CREATE SELECT。与INSERT SELECT将数据添加到一个已经存在的表不同CREATE SELECT将数据复制到一个新表有的 DBMS 可以覆盖已经存在的表这依赖于所使用的具体 DBMS。下面的例子说明如何使用CREATE SELECTCREATE TABLE CustCopy AS SELECT * FROM Customers;若是使用 SQL Server可以这么写SELECT * INTO CustCopy FROM Customers;分析这条SELECT语句创建一个名为CustCopy的新表并把Customers表的整个内容复制到新表中。因为这里使用的是SELECT *所以将在CustCopy表中创建并填充与Customers表相同的列结构。3. 插入数据时的注意事项插入数据时有几个常见的注意点数据类型匹配 在使用INSERT语句时确保插入的数据与目标表的列的数据类型匹配。例如如果某个列定义为INT类型你不能尝试插入一个字符串值。约束条件 如果目标表的列有约束条件如NOT NULL、UNIQUE、PRIMARY KEY插入数据时需要确保这些约束得到满足否则会导致插入失败。默认值与NULL值 如果某些列允许NULL或有默认值你可以选择不插入值DBMS 将自动填充NULL或默认值。如果列没有设置默认值且不允许NULL插入时必须提供值。避免重复数据 在插入数据时要特别注意主键的唯一性。如果尝试插入一条具有相同主键的记录将会出现错误。在插入前可以使用查询检查主键值是否已存在。批量插入 在某些情况下需要批量插入数据。可以使用多行INSERT语句来一次性插入多条记录。例如INSERT INTO Customers (cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES (1000000007, Toy Factory, 456 Some Street, Los Angeles, CA, 90001, USA), (1000000008, Tech Zone, 789 Tech Road, San Francisco, CA, 94105, USA), (1000000009, Book World, 101 Book Lane, Chicago, IL, 60601, USA);事务处理 如果你执行多个插入操作并且这些操作之间有依赖关系可以将它们放在一个事务中确保数据一致性。如果在插入过程中出现错误事务可以回滚从而避免部分插入成功导致数据不一致的情况。4. 总结INSERT语句是 SQL 中用来向表中插入数据的基础工具理解和掌握不同的插入方式对于有效地管理数据库至关重要。插入数据时应注意以下几点明确指定列名和插入顺序以确保插入数据的安全性。小心处理NULL和默认值。使用INSERT SELECT语法插入来自其他表的数据。在批量插入数据时要确保数据的一致性和完整性。通过事务控制确保插入操作的原子性。了解这些插入数据的基本操作和注意事项能够帮助你更高效地进行数据库的管理与维护。
SQL 插入数据详解
本文介绍如何利用 SQL 的INSERT语句将数据插入表中。1. 数据插入顾名思义INSERT用来将行插入或添加到数据库表。插入有几种方式插入完整的行插入行的一部分插入某些查询的结果。下面逐一介绍这些内容。1.1 插入完整的行把数据插入表中的最简单方法是使用基本的INSERT语法它要求指定表名和插入到新行中的值。下面举一个例子INSERT INTO Customers VALUES(1000000006, Toy Land, 123 Any Street, New York, NY, 11111, USA, NULL, NULL);分析这个例子将一个新顾客插入到Customers表中。存储到表中每一列的数据在VALUES子句中给出必须给每一列提供一个值。如果某列没有值如上面的cust_contact和cust_email列则应该使用NULL值假定表允许对该列指定空值。各列必须以它们在表定义中出现的次序填充。提示INTO关键字在某些 SQL 实现中跟在INSERT之后的INTO关键字是可选的。但是即使不一定需要最好还是提供这个关键字这样做将保证 SQL 代码在 DBMS 之间可移植。虽然这种语法很简单但并不安全应该尽量避免使用。上面的 SQL 语句高度依赖于表中列的定义次序还依赖于其容易获得的次序信息。即使可以得到这种次序信息也不能保证各列在下一次表结构变动后保持完全相同的次序。因此编写依赖于特定列次序的 SQL 语句是很不安全的这样做迟早会出问题。编写INSERT语句的更安全不过更烦琐的方法如下INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES(1000000006, Toy Land, 123 Any Street, New York, NY, 11111, USA, NULL, NULL);分析这个例子与前一个INSERT语句的工作完全相同但在表名后的括号里明确给出了列名。在插入行时DBMS 将用VALUES列表中的相应值填入列表中的对应项。VALUES中的第一个值对应于第一个指定列名第二个值对应于第二个列名如此等等。因为提供了列名VALUES必须以其指定的次序匹配指定的列名不一定按各列出现在表中的实际次序。其优点是即使表的结构改变这条INSERT语句仍然能正确工作。说明不能插入同一条记录两次如果你尝试了这个例子的两种方法会发现第二次生成了一条出错消息说 ID 为1000000006的顾客已经存在。在第一课我们说过主键的值必须有唯一性而cust_id是主键DBMS 不允许插入相同cust_id值的新行。下面的INSERT语句填充所有列与前面的一样但以一种不同的次序填充。因为给出了列名所以插入结果仍然正确INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip) VALUES(1000000006, NULL, NULL, Toy Land, 123 Any Street, New York, NY, 11111);提示总是使用列的列表不要使用没有明确给出列的INSERT语句。给出列能使 SQL 代码继续发挥作用即使表结构发生了变化。注意小心使用VALUES不管使用哪种INSERT语法VALUES的数目都必须正确。如果不提供列名则必须给每个表列提供一个值如果提供列名则必须给列出的每个列一个值。否则就会产生一条错误消息相应的行不能成功插入。1.2 插入部分行正如所述使用INSERT的推荐方法是明确给出表的列名。使用这种语法还可以省略列这表示可以只给某些列提供值给其他列不提供值。请看下面的例子INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES(1000000006, Toy Land, 123 Any Street, New York, NY, 11111, USA);分析在前面的例子中没有给cust_contact和cust_email这两列提供值。这表示没必要在INSERT语句中包含它们。因此这里的INSERT语句省略了这两列及其对应的值。注意省略列如果表的定义允许则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件该列定义为允许NULL值无值或空值。在表定义中给出默认值。这表示如果不给出值将使用默认值。注意省略所需的值如果表中不允许有NULL值或者默认值这时却省略了表中的值DBMS 就会产生错误消息相应的行不能成功插入。1.3 插入检索出的数据INSERT一般用来给表插入具有指定列值的行。INSERT还存在另一种形式可以利用它将SELECT语句的结果插入表中这就是所谓的INSERT SELECT。顾名思义它是由一条INSERT语句和一条SELECT语句组成的。假如想把另一表中的顾客列合并到Customers表中不需要每次读取一行再将它用INSERT插入可以如下进行INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) SELECT cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country FROM CustNew;说明新例子的说明这个例子从一个名为CustNew的表中读出数据并插入到Customers表。为了试验这个例子应该首先创建和填充CustNew表。CustNew表的结构与Customers表相同。在填充CustNew时不应该使用已经在Customers中用过的cust_id值如果主键值重复后续的INSERT操作将会失败。分析这个例子使用INSERT SELECT从CustNew中将所有数据导入Customers。SELECT语句从CustNew检索出要插入的值而不是列出它们。SELECT中列出的每一列对应于Customers表名后所跟的每一列。这条语句将插入多少行呢这依赖于CustNew表有多少行。如果这个表为空则没有行被插入也不产生错误因为操作仍然是合法的。如果这个表确实有数据则所有数据将被插入到Customers。提示INSERT SELECT中的列名为简单起见这个例子在INSERT和SELECT语句中使用了相同的列名。但是不一定要求列名匹配。事实上DBMS 一点儿也不关心SELECT返回的列名。它使用的是列的位置因此SELECT中的第一列不管其列名将用来填充表列中指定的第一列第二列将用来填充表列中指定的第二列如此等等。INSERT SELECT中SELECT语句可以包含WHERE子句以过滤插入的数据。提示插入多行INSERT通常只插入一行。要插入多行必须执行多个INSERT语句。INSERT SELECT是个例外它可以用一条INSERT插入多行不管SELECT语句返回多少行都将被INSERT插入。2. 从一个表复制到另一个表有一种数据插入不使用INSERT语句。要将一个表的内容复制到一个全新的表运行中创建的表可以使用CREATE SELECT语句或者在 SQL Server 里也可用SELECT INTO语句。说明DB2 不支持DB2 不支持这里描述的CREATE SELECT。与INSERT SELECT将数据添加到一个已经存在的表不同CREATE SELECT将数据复制到一个新表有的 DBMS 可以覆盖已经存在的表这依赖于所使用的具体 DBMS。下面的例子说明如何使用CREATE SELECTCREATE TABLE CustCopy AS SELECT * FROM Customers;若是使用 SQL Server可以这么写SELECT * INTO CustCopy FROM Customers;分析这条SELECT语句创建一个名为CustCopy的新表并把Customers表的整个内容复制到新表中。因为这里使用的是SELECT *所以将在CustCopy表中创建并填充与Customers表相同的列结构。3. 插入数据时的注意事项插入数据时有几个常见的注意点数据类型匹配 在使用INSERT语句时确保插入的数据与目标表的列的数据类型匹配。例如如果某个列定义为INT类型你不能尝试插入一个字符串值。约束条件 如果目标表的列有约束条件如NOT NULL、UNIQUE、PRIMARY KEY插入数据时需要确保这些约束得到满足否则会导致插入失败。默认值与NULL值 如果某些列允许NULL或有默认值你可以选择不插入值DBMS 将自动填充NULL或默认值。如果列没有设置默认值且不允许NULL插入时必须提供值。避免重复数据 在插入数据时要特别注意主键的唯一性。如果尝试插入一条具有相同主键的记录将会出现错误。在插入前可以使用查询检查主键值是否已存在。批量插入 在某些情况下需要批量插入数据。可以使用多行INSERT语句来一次性插入多条记录。例如INSERT INTO Customers (cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES (1000000007, Toy Factory, 456 Some Street, Los Angeles, CA, 90001, USA), (1000000008, Tech Zone, 789 Tech Road, San Francisco, CA, 94105, USA), (1000000009, Book World, 101 Book Lane, Chicago, IL, 60601, USA);事务处理 如果你执行多个插入操作并且这些操作之间有依赖关系可以将它们放在一个事务中确保数据一致性。如果在插入过程中出现错误事务可以回滚从而避免部分插入成功导致数据不一致的情况。4. 总结INSERT语句是 SQL 中用来向表中插入数据的基础工具理解和掌握不同的插入方式对于有效地管理数据库至关重要。插入数据时应注意以下几点明确指定列名和插入顺序以确保插入数据的安全性。小心处理NULL和默认值。使用INSERT SELECT语法插入来自其他表的数据。在批量插入数据时要确保数据的一致性和完整性。通过事务控制确保插入操作的原子性。了解这些插入数据的基本操作和注意事项能够帮助你更高效地进行数据库的管理与维护。