本章介绍如何利用SQL的INSERT语句将数据插入表中。
INSERT插入可以用几种方式使用:
插入完整的行一般有两种方法。第一种方法要求指定表名和被插入到新行的值:
INSERT INTO customers
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);
这种方法要求对每个列必须提供一个值,且各个列必须以它们在表定义中出现的次序填充。
这种依赖于特定列次序的SQL语句是很不安全的,因为很难保证下一次表结构变动后各个列保持完全相同的次序。
第二种方法更安全(不过更烦琐),如下:
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);
这种方法在表名后的括号里明确地给出了列名。在插入行时,MySQL将用VALUES列表中的相应值填入列表中的对应项。
此外,使用第二种方法还可以忽略列。这表示可以只给某些列提供值,给其他列不提供值。
省略列必须满足以下条件之一:
- 该列定义为允许NULL值(无值或空值)
- 在表定义中给出默认值。
INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT语句的性能。如果数据检索是最重要的,可以在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级,如下所示:
INSERT LOW_PRIORITY INTO
允许一次插入多个行。可以使用多条INSERT语句,或者,只要每条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'
);
MySQL使用单条INSERT语句处理多个插入比使用多条INSERT语句快。
还可以利用INSERT SELECT,将一条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;
这个例子导入了cust_id(假设你能够确保cust_id的值不会重复)。你也可以简单地省略这列(从INSERT和SELECT中),这样MySQL就会生成新值。
MySQL不关心SELECT返回的列名,它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一个列,第二列也是如此,以此类推。
INSERT SELECT中SELECT语句可包含WHERE子句以过滤插入的数据。
可使用UPDATE语句更新(修改)表中的数据,可采用两种方式使用UPDATE:
注意,使用UPDATE时一定不要忽略WHERE子句,否则将会更新表中所有行(除非确实需要)!
UPDATE语句由3部分组成,分别是:
假设要更新客户10005的电子邮件地址,可如下:
UPDATE customers
SET cust_email = '[email protected]'
WHERE cust_id = 10005;
如要更新多个列,可如下:
UPDATE customers
SET cust_name = 'The Fudds',
cust_email = '[email protected]'
WHERE cust_id = 10005;
UPDATE语句中可以使用子查询,使得能用SELECT语句检索出的数据更新列数据。
为了删除某个列的值,可设置它为NULL(假如表定义允许NULL值)。如下进行:
UPDATE customers
SET cust_email = NULL
WHERE cust_id = 10005;
从表中删除数据,可用DELETE,有两种方法:
注意,使用DELETE时一定不要忽略WHERE子句,否则将会删除表中所有行(除非确实需要)!
下面的语句从表中删除一行:
DELETE FROM customers
WHERE cust_id = 10006;
DELETE删除整行而不是删除列。
DELETE删除的是表的内容,而不是表本身。
如果想从表中删除所有行,不要使用DELETE,可使用TRUNCATE TABLE语句,它完成相同的工作,但更快!(TRUNCATE TABLE实际是删除原来的表然后重新创建一个表,而不是逐行删除表中的数据)
最后需要注意的是,MySQL没有撤销功能,所以应该非常小心地使用UPDATE和DELETE。