CREATE TABLE dept (
department_id int NOT NULL,
department_name varchar(30) NOT NULL,
CONSTRAINT dept_pkey PRIMARY KEY (department_id)
);
CREATE TABLE emp (
employee_id int NOT NULL,
first_name varchar(20) NULL,
last_name varchar(25) NOT NULL,
hire_date date not null default current_date,
salary numeric(8,2) NULL,
manager_id int NULL,
department_id int NULL,
CONSTRAINT emp_pkey PRIMARY KEY (employee_id),
CONSTRAINT fk_emp_dept FOREIGN KEY (department_id) REFERENCES dept(department_id) ON DELETE CASCADE,
CONSTRAINT fk_emp_manager FOREIGN KEY (manager_id) REFERENCES emp(employee_id)
);
INSERT INTO table_name(column1, column2, ...)
VALUES (value1, value2, ...);
INSERT INTO dept(department_id, department_name) VALUES ( 10, 'Administration');
select * from dept;
department_id|department_name|
-------------|---------------|
10|Administration |
INSERT INTO dept VALUES ( 20, 'Marketing');
select * from dept;
department_id|department_name|
-------------|---------------|
10|Administration |
20|Marketing |
INSERT INTO emp
VALUES (200, 'Jennifer', 'Whalen', '2020-01-01', 4400.00, NULL, 10),
(201, 'Michael', 'Hartstein', '2020-02-02', 13000.00, NULL, 20),
(202, 'Pat', 'Fay', default, 6000.00, 201, 20);
select * from emp;
employee_id|first_name|last_name|hire_date |salary |manager_id|department_id|
-----------|----------|---------|----------|--------|----------|-------------|
200|Jennifer |Whalen |2020-01-01| 4400.00| | 10|
201|Michael |Hartstein|2020-02-02|13000.00| | 20|
202|Pat |Fay |2020-04-14| 6000.00| 201| 20|
create table emp1 (like emp);
insert into emp1
select * from emp
where department_id = 20;
select * from emp1;
employee_id|first_name|last_name|hire_date |salary |manager_id|department_id|
-----------|----------|---------|----------|--------|----------|-------------|
201|Michael |Hartstein|2020-02-02|13000.00| | 20|
202|Pat |Fay |2020-04-14| 6000.00| 201| 20|
insert into dept
values (30, 'Purchasing')
returning department_id;
department_id|
-------------|
30|
UPDATE table_name
SET column1 = value1,
column2 = value2,
...
WHERE conditions;
update emp
set salary = salary + 1000,
department_id = 20
where employee_id = 200;
update emp1
set salary = emp.salary,
department_id = emp.department_id,
manager_id = emp.manager_id
from emp
where emp1.employee_id = emp.employee_id;
update emp
set salary = salary + 1000,
department_id = 20
where employee_id = 200
returning first_name, last_name, salary;
first_name|last_name|salary |
----------|---------|-------|
Jennifer |Whalen |6400.00|
DELETE FROM table_name
WHERE conditions;
delete
from emp1
where employee_id = 201;
delete
from emp1
using emp
where emp1.employee_id = emp.employee_id;
delete
from emp1
where emp1.employee_id in (select employee_id from emp);
-- 先插入一些数据
insert into emp1
select * from emp
where department_id = 20;
delete
from emp1
returning *;
employee_id|first_name|last_name|hire_date |salary |manager_id|department_id|
-----------|----------|---------|----------|--------|----------|-------------|
201|Michael |Hartstein|2020-02-02|13000.00| | 20|
202|Pat |Fay |2020-04-14| 6000.00| 201| 20|
200|Jennifer |Whalen |2020-01-01| 6400.00| | 20|
MERGE INTO target
USING source
ON join_condition
{ WHEN MATCHED THEN { UPDATE| DELETE | DO NOTHING } |
WHEN NOT MATCHED THEN { INSERT | DO NOTHING } };
CREATE TABLE account (
id INTEGER PRIMARY KEY,
balance NUMERIC NOT NULL,
status VARCHAR(1) NOT NULL CHECK (status IN ('Y', 'N'))
);
MERGE INTO account a
USING (VALUES(1, 0, 'Y')) s(id, balance, status)
ON a.id = s.id
WHEN MATCHED THEN
UPDATE SET balance = s.balance, status = s.status
WHEN NOT MATCHED THEN
INSERT (id, balance, status)
VALUES (s.id, s.balance, s.status);
SELECT * FROM account;
id|balance|status|
--|-------|------|
1| 0|Y |
MERGE INTO account a
USING (VALUES(1, 100, 'Y')) s(id, balance, status)
ON a.id = s.id
WHEN MATCHED THEN
UPDATE SET balance = s.balance, status = s.status
WHEN NOT MATCHED THEN
INSERT (id, balance, status)
VALUES (s.id, s.balance, s.status);
SELECT * FROM account;
id|balance|status|
--|-------|------|
1| 100|Y |
MERGE INTO account a
USING (VALUES(1, 100, 'N')) s(id, balance, status)
ON a.id = s.id
WHEN MATCHED AND s.status = 'N' THEN
DELETE
WHEN MATCHED THEN
UPDATE SET balance = s.balance, status = s.status
WHEN NOT MATCHED THEN
INSERT (id, balance, status)
VALUES (s.id, s.balance, s.status);
SELECT * FROM account;
id|balance|status|
--|-------|------|
INSERT INTO table_name(column1, column2, ...)
{VALUES (value1, value2, ...) | SELECT ...}
ON CONFLICT conflict_target conflict_action;
( { index_column_name | ( index_expression ) } ),基于某个具有索引的字段或者表达式进行判断;
ON CONSTRAINT constraint_name,基于某个唯一约束进行判断。
DO NOTHING,如果数据已经存在,不做任何操作;
DO UPDATE SET,如果数据已经存在,更新该数据;可以使用 WHERE 子句进一步限制需要更新的数据。
INSERT INTO emp
values (200, 'Jennifer', 'Whalen', '2020-01-01', 4400.00, NULL, 10)
SQL Error [23505]: ERROR: duplicate key value violates unique constraint "emp_pkey"
Detail: Key (employee_id)=(200) already exists.
INSERT INTO emp
values (200, 'Jennifer', 'Whalen', '2020-01-01', 4400.00, NULL, 10)
on conflict (employee_id)
do nothing;
SELECT department_id
FROM emp
WHERE employee_id = 200;
department_id|
-------------|
20|
INSERT INTO emp
values (200, 'Jennifer', 'Whalen', '2020-01-01', 4400.00, NULL, 10)
on conflict on constraint emp_pkey
do update
set first_name = EXCLUDED.first_name,
last_name = EXCLUDED.last_name,
hire_date = EXCLUDED.hire_date,
salary = EXCLUDED.salary,
manager_id =EXCLUDED.manager_id,
department_id = EXCLUDED.department_id;
SELECT *
FROM emp
WHERE employee_id = 200;
employee_id|first_name|last_name|hire_date|salary|manager_id|department_id|
-----------|----------|---------|----------|-------|--------|-------------|
200|Jennifer |Whalen |2020-01-01|4400.00| | 10|
原文作者:SQL编程思想;如有侵权,请联系管理员删除。