SQL-INSERT-插入数据

时间:2024-11-13 07:29:45

INSERT 用来将行插入(或添加)到数据库表。

插入有几种方式:

  1. 插入完整的行;
  2. 插入行的一部分;
  3. 插入某些查询的结果。

使用INSERT语句可能需要客户端/服务器DBMS中的特定安全权限。在试图使用INSERT前,应该保证自己有足够的安全权限。

1. 插入完整的行

INSERT INTO customers
VALUES('1000000006',
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA',
       NULL,
       NULL);

各列必须以它们在表中出现的次序填充。

INTO关键字:在某些SQL实现中,跟在INSERT之后的INTO关键字是可选的。

编写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);

注意:因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序。其优点是,即使表的结构改变,这条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代码继续发挥作用,即使表结构发生了变化。

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');

省略列

如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件:

  1. 该列定义为允许NULL值(无值或空值)。
  2. 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

如果对表中不允许NULL值且没有默认值的列不给出值,DBMS将产生错误消息,并且相应的行插入不成功。

不管使用哪种INSERT语法,VALUES的数目都必须正确。如果不提供列名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入。

3. 插入检索出的数据

利用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。

INSERT SELECT中的列名

DBMS一点儿也不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。

插入多行

INSERT通常只插入一行。要插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。

4. 从一个表复制到另一个表

SELECT INTO语句:将一个表的内容复制到一个全新的表(运行中创建的表)。

DB2不支持这里描述的SELECT INTO。

INSERT SELECT 与 SELECT INTO
它们之间的一个重要差别是前者导出数据,而后者导入数据。

-- 创建一个名为custcopy的新表,并把customers表的整个内容复制到新表中
SELECT * INTO custCoty FROM customers;

-- MariaDB、MySQL、Oracle、PostgreSQL和SQLite所使用的语法
CREATE TABLE custcopy AS
SELECT * FROM customers;

SELECT使用*通配符:导入所有数据。
SELECT使用列名:导入部分的列。

使用SELECT INTO复制表,可在复制的数据上测试SQL代码,而不会影响实际的数据。

注意:
1. 数据库字符串使用单引号。
2. 数据库大小写不敏感。
3. cuid算法是一种可以产生唯一标识的高效算法,它使用网卡MAC,地址,纳米级时间、芯片ID等算出来的:select newid();