INSERT 用来将行插入(或添加)到数据库表。
插入有几种方式:
- 插入完整的行;
- 插入行的一部分;
- 插入某些查询的结果。
使用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操作中省略某些列。省略的列必须满足以下某个条件:
- 该列定义为允许NULL值(无值或空值)。
- 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
如果对表中不允许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();