三、表的修改:
1. 增加字段: ALTER TABLE productsADD COLUMN description text;
新增的字段对于表中已经存在的行而言最初将先填充所给出的缺省值(如果你没有声明DEFAULT子句,那么缺省是空值)。
在新增字段时,可以同时给该字段指定约束。 ALTER TABLE products ADD COLUMN description text CHECK(description <> '');
2. 删除字段: ALTER TABLE products DROP COLUMN description;
如果该表为被引用表,该字段为被引用字段,那么上面的删除操作将会失败。如果要想在删除被引用字段的同时级联的删除其所有引用字段,可以采用下面的语法形式。 ALTER TABLE products DROP COLUMN description CASCADE;
3. 增加约束: ALTER TABLE products ADD CHECK(name <> ''); --增加一个表级约束 ALTER TABLE productsADD CONSTRAINT same_name UNIQUE(product_no);--增加命名的唯一性约束。 ALTER TABLE productsADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增加外键约束。 ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; --增加一个非空约束。
4. 删除约束: ALTER TABLE products DROP CONSTRAINT some_name;
对于显示命名的约束,可以根据其名称直接删除,对于隐式自动命名的约束,可以通过psql的\d tablename来获取该约束的名字。和删除字段一样,如果你想删除有着被依赖关系的约束,你需要用CASCADE。一个例子是某个外键约束依赖被引用字段上的唯一约束或者主键约束。如: MyTest=# \d products
Table "public.products"
Column | Type | Modifiers
------------+---------+-----------
product_no | integer |
name | text |
price | numeric |
Check constraints: "positive_price" CHECK (price > 0::numeric)
和其他约束不同的是,非空约束没有名字,因此只能通过下面的方式删除: ALTER TABLE productsALTER COLUMN product_no DROP NOT NULL;
5. 改变字段的缺省值:
在为已有字段添加缺省值时,不会影响任何表中现有的数据行, 它只是为将来INSERT命令改变缺省值。 ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
下面为删除缺省值: ALTER TABLE products ALTER COLUMN price DROP DEFAULT
6. 修改字段的数据类型:
只有在字段里现有的每个项都可以用一个隐含的类型转换转换成新的类型时才可能成功。比如当前的数据都是整型,而转换的目标类型为numeric或varchar,这样的转换一般都可以成功。与此同时,PostgreSQL还将试图把字段的缺省值(如果存在)转换成新的类型, 还有涉及该字段的任何约束。但是这些转换可能失败,或者可能生成奇怪的结果。 在修改某字段类型之前,你最好删除那些约束,然后再把自己手工修改过的添加上去。 ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
7. 修改字段名: ALTER TABLE products RENAME COLUMN product_no TO product_number;
8. 修改表名: ALTER TABLE productsRENAME TO items;
四、权限:
只有表的所有者才能修改或者删除表的权限。要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令。
需要指出的是,PUBLIC是特殊"用户"可以用于将权限赋予系统中的每一个用户。在声明权限的位置写ALL则将所有的与该对象类型相关的权限都赋予出去。 GRANT UPDATE ON table_name TO user; --将表的更新权限赋予指定的user。 GRANT SELECT ON table_name TO GROUP group; --将表的select权限赋予指定的组。 REVOKE ALL ON table_name FROM PUBLIC; --将表的所有权限从Public撤销。
最初,只有对象所有者(或者超级用户)可以赋予或者撤销对象的权限。但是,我们可以赋予一个"with grant option"权限,这样就给接受权限的人以授予该权限给其它人的权限。如果授予选项后来被撤销,那么所有那些从这个接受者接受了权限的用户(直接或者通过级连的授权)都将失去该权限。