CREATETABLE COMPANY5( ID INTPRIMARY KEY NOTNULL, NAME TEXT, AGE INT, ADDRESS CHAR(50), SALARY REAL, EXCLUDE USING gist (NAME WITH=, -- 如果满足 NAME 相同,AGE 不相同则不允许插入,否则允许插入 AGE WITH<>) -- 其比较的结果是如果整个表达式返回 true,则不允许插入,否则允许 );
USING gist 是用于构建和执行的索引一种类型。
这里需要注意的是,在使用这个SQL语句前记得用CREATE EXTENSION IF NOT EXISTS btree_gist;来开启扩展,不然会无法创建。
然后插入数据
1 2 3 4 5
INSERTINTO COMPANY5 VALUES(1, 'Paul', 32, 'California', 20000.00 ); INSERTINTO COMPANY5 VALUES(2, 'Paul', 32, 'Texas', 20000.00 ); -- 此条数据的 NAME 与第一条相同,且 AGE 与第一条也相同,故满足插入条件 INSERTINTO COMPANY5 VALUES(3, 'Allen', 42, 'California', 20000.00 ); -- 此数据与上面数据的 NAME 相同,但 AGE 不相同,故不允许插入
结果:
1 2
ERROR: conflicting key value violates exclusion constraint "company7_name_age_excl" DETAIL: Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).
CREATETABLE COMPANY( ID INTPRIMARY KEY NOTNULL, NAME TEXT NOTNULL, AGE INTNOTNULL, ADDRESS CHAR(50), SALARY REAL ); INSERTINTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERTINTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERTINTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
SELECT ... FROM table1 LEFTOUTERJOIN table2 ON conditional_expression ...
右连接
1
SELECT ... FROM table1 RIGHTOUTERJOIN table2 ON conditional_expression ...
基于上面的表可以写下面的两个连接
1 2
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFTJOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHTJOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
OUTER JOIN
返回table1和table2中所有行,如果任意一表中没有匹配的行,对应的列将返回NULL。
基本语法如下:
1
SELECT ... FROM table1 FULLOUTERJOIN table2 ON conditional_expression ...
基于上面的表可以写下面的连接
1
SELECT EMP_ID, NAME, DEPT FROM COMPANY FULLOUTERJOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;