UPDATE 命令总是要求一个 SET 在某个位置出现,并且这个特定的 INSERT 还要求有一个 VALUES 才完整
可以用"select"表示一个字段或者表的名字,而一个没有引号的 select 将被当做一条命令的一部分
SQL 标识符和关键字必须以一个字母(a-z 以及带变音符的字母和非拉丁字母)或下划线(_)开头,随后的字符可以是字母、下划线、数字(0-9)、美元符号($)。需要注意的是,根据 SQL 标准,美元符号不允许出现在标识符中,因此使用美元符号将不易移植。SQL 标准不会定义包含数字或者以下划线开头或结尾的关键字
注释
-- 这是标准的 SQL92 注释
还可以使用C-风格的块注释:
/* 多行注释
* 可以嵌套: /* 被嵌套的块注释 */
*/
删除表
DROP TABLE my_first_table
试图删除一个不存在的表是一个错误。不过,在 SQL 脚本文件里,我们通常在创建表之前无条件删除它并忽略错误信息。
当然你还可以使用 DROP TABLE IF EXISTS 来避免警告信息,不过这并不符合 SQL 标准
缺省值
缺省值可以是一个表达式,它会在插入缺省值的时候计算(不是在创建表的时候)。
个常见的例子是一个 timestamp 字段可能有缺省值 now()
CREATE TABLE products (
product_no integer,
name text,
price numeric DEFAULT 9.99
);
CREATE TABLE products (
product_no integer DEFAULT nextval('products_product_no_seq'),
...);
CREATE TABLE products (
product_no SERIAL,
...);
后两个为每一行生成一个"序列号
约束
检查约束
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);
你还可以给这个约束取一个独立的名字
CREATE TABLE products (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0)
);
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);
非空:
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric);
唯一约束
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric);
CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c)
);
可以给唯一约束赋予一个自己定义的名字
CREATE TABLE products (
product_no integer CONSTRAINT must_be_different UNIQUE,
name text,
price numeric
);
主键CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);CREATE TABLE example (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
);
外键CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
product_no integer REFERENCES products (product_no),
quantity integer
);
我们不能创建任何其 product_no 没有在产品表中出现的订单也可以把上面的命令简写成
CREATE TABLE orders (order_id integer PRIMARY KEY,
product_no integer REFERENCES products,
quantity integer
);
因为如果缺少字段列表的话,就会引用被引用表的主键。
一个外键也可以约束和引用一组字段。同样,也需要写成表约束的形式。下面是一个捏造出来的语法例子:
CREATE TABLE t1 (
a integer PRIMARY KEY,
b integer,
c integer,
FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
);
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text,
...
);CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT,
order_id integer REFERENCES orders ON DELETE CASCADE,
quantity integer,
PRIMARY KEY (product_no, order_id)
);限制和级联删除是两种最常见的选项。RESTRICT 禁止删除被引用的行。
NO ACTION 的意思是如果在检查约束的时候还存在任何引用行,则抛出错误
增加字段
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
删除字段
ALTER TABLE products DROP COLUMN description CASCADE;
通过使用 CASCADE 指明删除任何依赖该字段的东西:
增加约束
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
删除约束
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
修改字段的数据类型
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
重命名字段ALTER TABLE products RENAME COLUMN product_no TO product_number;
重命名表
ALTER TABLE products RENAME TO items;