INSERT语句

插入数据

INSERT使用来插入(或添加)行到数据库表的,可以用集中方式使用:

  • 插入完整的行
  • 插入行的一部分
  • 插入多行
  • 插入某些查询的结果

插入及系统安全

MySQL的安全机制可针对每个表或每个用户,禁止使用INSERT语句

插入完整的行

INSERT语法要求指定表名和被插入到新行中的值

  • 例1
INSERT INTO customers
VALUES
	( NULL,"Pep E. LaPew", "100 Main Street", "Los Angeles", "CA", "90046", "USA", NULL, NULL );

此例子插入一个新客户到customers表
虽然这种语法很简单,但并不安全,应该尽量避免使用。其高度依赖于表中列的定义次数,并且还依赖于其次序容易获得的信息。
image.png

  • 例2
INSERT INTO customers ( cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email )
VALUES
	( "Pep E. LaPew", "100 Main Street", "Los Angeles", "CA", "90046", "USA", NULL, NULL );

因为提供了列名字,VALUES只需要一起指定的次序匹配指定的列名,不需要按照各个列出现在实际表中的次序,即使表的结构改变,此INSERT语句仍然能够正确工作
image.png

注意

  • 总是使用列的列表
    应该总是使用列的列表,使用列的列表能使SQL代码继续发挥作用(即使表结构发生了变化)
  • 仔细地给出值
    不管使用哪种INSERT语法,都必须给出VALUES的正确数目
  • 省略列
    如果表的定义允许,可以在INSERT操作中省略某些列,列需满足:
    1.允许为NULL值
    2.给出默认值,如果不给出值,将使用默认值
  • 提高整体性能
    INSERT操作可能很耗时,特别是有很多索引需要更新时,其可能降低等待处理的SELECT语句的性能
    可以通过在INSERT和INTO之间添加 关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级。INSERT LOW_PRIORITY INTO

插入多个行

插入多个行可以使用多条INSERT语句或只使用一次,每条语句用一个分号结束。
1.使用多条INSERT语句

INSERT INTO customers ( cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country )
VALUES
	( "Pep E. LaPew", "100 Main Street", "Los Angeles", "CA", "90046", "USA" );
INSERT INTO customers ( cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country )
VALUES
	( "M. Martian", "42 Galaxy Way", "New York", "NY", "11213", "USA" );

image.png
2.使用一条INSERT语句

INSERT INTO customers ( cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country )
VALUES
	( "Pep E. LaPew", "100 Main Street", "Los Angeles", "CA", "90046", "USA" ),
	( "M. Martian", "42 Galaxy Way", "New York", "NY", "11213", "USA" );

单条INSERT语句有多组只,每组值用一堆圆括号扩起来,用逗号分隔
image.png

  • 提高MySQL的性能
    MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句更快

插入检索出的数据

还可以用INSERT将一条SELECT语句的结果插入表中,即INSERT SELECT,其由一条INSERT语句和一条SELECT语句组成

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;

其使用INSERT SELECT从custnew中将所有数据导入customers表中。
这个丽日导入了cust_id(如果能确保cust_id不重复),也可以省略这行,这样MySQL就会生成新值。

  • INSERT SELECT中SELECT语句可包含WHERE子句以过滤插入的数据

INSERT SELECT中的列名

在INSERT和SELECT语句中使用了相同的列名。但是不一定要求列名匹配。MySQL甚至不关心SELECT返回的列名。


这个家伙很懒,啥也没有留下😋