插入数据分为以下几种方式:
1. 插入完整的行;
2. 插入行的一部分
3. 插入某些查询的结果
4. 从一个表复制到另一个表
1. 插入完整的行,有两种方式:
INSERT INTO Customers VALUES (); // 缺点:高度依赖表中列的定义次序,不能保证各列在下一次表结构变动后保持完全相同的次序。
INSERT INTO Customers ( 列名组 ) VALUES ( 列值 );
2. 插入行的一部分
即 1 中的第二种方式,但要注意的是 省略的列是否允许为NULL值,在表中定义中给出的默认值等完整性约束条件。
3. 插入某些查询的结果
INSERT SELECT,是由一条INSERT语句和一条SELECT语句组成的,将SELECT语句的结果插入表中。
INSERT通常只插入一行,要插入多行,必须执行多个INSERT语句,INSERT SELECT是个例外,它可以用一条INSERT语句插入多行,不管SELECT语句返回多少行,都将被INSERT插入,其中的SELECT语句可以包含WHERE子句,过滤插入的数据。
例如:想把另一表中的顾客列合并到Customers表中,不需要每次读取一行再将它用于INSERT插入,
INSERT INTO Customers(
列名组合
)
SELECT 列名组合 FROM CustNew; 这里注意 不要从CustNew表中取出主键值,因为取出后的主键值会与Customer表的主键值重复,从而后续的INSERT 操作会失败,其中并且要保证 两个表的 列名组合中的各列的相对位置是否对应。
4. 从一个表复制到另一个表
从一个表复制到另一个表其实可以使用上面的那种方法,但是上面的表需要首先建立一个表,而使用SELECT INTO语句直接建立新表。
可以使用SELECT INTO语句会将数据复制到一个新表,与INSERT SELECT的差别是 前者是导入数据,而后者是导出数据。
SELECT * INTO CustCopy FROM Customers; // 创建一个名为 CustCopy的新表,并把Customers表中的整体内容复制到新表,因为是 SELECT * ,如果想只复制部分的列,可以明确给出列名,而不是使用 * 通配符
但是 MySql、MariaDBm、SQLite的格式有所变化,如下:
CREATE TABLE CustCopy AS SELECT * FROM Customers;