跳转到内容

结构化查询语言/插入 1

来自维基教科书,开放世界中的开放书籍



提示:小心并停用 AUTOCOMMIT


INSERT 命令将一个或多个新行存储到一个表中。新行的内容由固定值或运行时评估的 SELECT 结果组成。因此,有两种不同的语法可以完成这项工作。

静态插入

[编辑 | 编辑源代码]
-- The static version of the INSERT command
INSERT INTO <tablename> (<list_of_columnnames>)
VALUES                  (<list_of_values>),
                        (<list_of_values>),
                        (<list_of_values>),
                             ... ;


在表名之后,我们可以列出受影响的列,并在关键字 'VALUES' 之后声明一个或多个值列表以插入。每个值列表代表一行新行。列和值的列表必须一致,这样列表条目数量相同,数据类型相关联。

-- One value list results in one new row.
INSERT INTO person (id,  firstname,       lastname,    date_of_birth,     place_of_birth, ssn,           weight)
VALUES             (91,  'Larry, no. 91', 'Goldstein', DATE'1970-11-20', 'Dallas',        '078-05-1120', 95);
COMMIT;

-- The SQL standard - but not all implementations, in particular Oracle - supports a 'row value constructor' by
-- enumerate values inside a pair of parenthesis as shown in the above green box.  
-- Three lists of values (= row value constructors) result in three new rows. Please note the comma after all 
-- but the last one.
INSERT INTO person (id,  firstname,       lastname,    date_of_birth,     place_of_birth, ssn,           weight)
VALUES             (92,  'Larry, no. 92', 'Goldstein', DATE'1970-11-20', 'Dallas',        '078-05-1120', 95),
                   (93,  'Larry, no. 93', 'Goldstein', DATE'1970-11-20', 'Dallas',        '078-05-1120', 95),
                   (94,  'Larry, no. 94', 'Goldstein', DATE'1970-11-20', 'Dallas',        '078-05-1120', 95);
COMMIT;


我们可以选择任意列顺序,但列名和值必须一致。

-- Sometimes things are scrambled. Maybe confusing, but works fine. See weight and id.
INSERT INTO person (date_of_birth, firstname, ssn, lastname, place_of_birth, weight, id)
VALUES             (DATE'1970-11-20', 'Larry, no. 95', '078-05-1120', 'Goldstein', 'Dallas', 95, 95);
COMMIT;


我们可以省略不必要的列。

-- Depending on CREATE TABLE statement the missing columns will get the 'null special marker' or a default value.
INSERT INTO person (id,  firstname,       lastname,     weight)
VALUES             (96,  'Larry, no. 96', 'Goldstein',  95);
COMMIT;


清理您的表格。

DELETE FROM person WHERE id BETWEEN 91 AND 96;
COMMIT;

动态插入

[编辑 | 编辑源代码]

与上一段不同,我们可以插入在运行时从任何表、函数或计算中评估的动态值,而不是固定值。即使新行的数量也可以是动态的。所有这些都在一个子选择中完成,它替换 VALUE 子句。我们在页面 高级插入 中解释了这种技术。有关列数和顺序或省略值的规则仍然有效。

为 Peter Hufington 先生插入一个新行,其体重为 67 公斤。他出生于洛杉矶。

点击查看解决方案
-- Choose any free id
INSERT INTO person (id,  firstname,       lastname,     weight, place_of_birth)
VALUES             (81,  'Peter, no. 81', 'Hufington',  67,     'Los Angeles');
COMMIT;
-- Check your result
SELECT * FROM person;


华夏公益教科书