当前位置: 主页 > 天剑狂刀BT页游 >

ALTER TABLE(2)

时间:2023-03-24 22:56来源:8N.org.Cn 作者:天剑狂刀私服 点击:

如果需要增加一个新的约束但是不希望长时间阻塞表更新,那么使用现有 索引增加约束会有所帮助。要这样做,用 CREATE INDEX CONCURRENTLY创建该索引,并且 接着使用这种语法把它安装为一个正式的约束。例子见下文。

ALTER CONSTRAINT

这种形式修改之前创建的一个约束的属性。当前只能修改外键约束。

VALIDATE CONSTRAINT

这种形式验证之前创建为NOT VALID的外键或检查约束, 它会扫描表来确保对于该约束没有行不满足约束。如果约束已经被标记为合法, 则什么也不会发生。

在大型表上的验证可能是一个长时间的处理。把约束的验证和创建分离开来让 我们可以把验证过程推迟到系统闲时进行,或者可以得到额外的时间来更正已 经存在的错误从而避免新的错误。还要注意验证本身并不会在运行时阻止对表 的写命令。

验证只要求被修改表上的一个SHARE UPDATE EXCLUSIVE 锁。如果该约束是一个外键,则还会在被该约束引用的表上要求一个 ROW SHARE锁。

DROP CONSTRAINT [ IF EXISTS ]

这种形式在一个表上删除指定的约束。如果IF EXISTS 被指定并且该约束不存在,不会抛出错误。在这种情况下会发出一个提示。

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

这些形式配置属于该表的触发器的触发设置。系统仍然知道被禁用触发器 的存在,但是即使它的触发事件发生也不会执行它。对于一个延迟触发器, 会在事件发生时而不是触发器函数真正被执行时检查其启用状态。可以禁 用或者启用用名称指定的单个触发器、表上的所有触发器、用户拥有的触 发器(这个选项会排除内部生成的约束触发器,例如用来实现外键约束或 可延迟唯一和排除约束)。禁用或者启用内部生成的约束触发器要求超级 用户特权,这样做要小心因为如果这类触发器不被执行,约束的完整性当 然无法保证。触发器引发机制也受到配置变量 的影响。当复制角色是 origin(默认)或者local时,被简单禁用的 触发器将被触发。被配置为ENABLE REPLICA的触发 器只有在会话处于replica模式时才将被触发。被配置为 ENABLE ALWAYS的触发器的触发不会考虑当前复制 模式。

这个命令要求一个SHARE ROW EXCLUSIVE锁。

DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE

这些形式配置属于表的重写规则的触发设置。系统仍然知道一个被禁用规则的 存在,但在查询重写时不会应用它。其语义与禁用的/启用的触发器的一样。 对于ON SELECT规则会忽略这个配置,即使当前会话处于 一种非默认的复制角色,这类规则总是会被应用以保持视图工作正常。

DISABLE/ENABLE ROW LEVEL SECURITY

这些形式控制属于该表的行安全性策略的应用。如果被启用并且该表上 不存在策略,则将应用一个默认否定的策略。注意即使行级安全性被禁 用,在表上还是可以存在策略。在这种情况下,这些策略将 不 会被应用 并且会被忽略。另见CREATE POLICY

NO FORCE/FORCE ROW LEVEL SECURITY

这些形式控制当用户是表拥有者时表上的行安全性策略的应用。如果被启用, 当用户是表拥有者时,行级安全性策略将被应用。如果被禁用(默认),则 当用户是表拥有者时,行级安全性将不会被应用。另见 CREATE POLICY

CLUSTER ON

这种形式为未来的CLUSTER操作选择默认的索引。 它不会真正地对表进行聚簇。

改变聚簇选项要求一个SHARE UPDATE EXCLUSIVE锁。

SET WITHOUT CLUSTER

这种形式从表中移除最近使用的 CLUSTER索引说明。这会影响未来的不指定索引 的聚簇操作。

改变聚簇选项要求一个SHARE UPDATE EXCLUSIVE锁。

SET WITH OIDS

这种形式为表增加一个oid系统列(见 第5.4节)。如果该表已经有 OID,则它 什么也不会做。

注意这不等效于ADD COLUMN oid oid,后者只是会增加一个 恰好名为oid的普通列而不是系统列。

SET WITHOUT OIDS

这种形式从该表移除oid系统列。这完全等效于 DROP COLUMN oid RESTRICT,不过如果没有 oid列它不会抱怨。

SET TABLESPACE

这种形式把该表的表空间更改为指定的表空间并且把该表相关联的数据文件 移动到新的表空间中。表上的索引(如果有)不会被移动,但是它们可以用 额外的SET TABLESPACE命令单独移动。当前数据库在 一个表空间中的所有表可以用ALL IN TABLESPACE形式 移动,这将会首先锁住所有将被移动的表然后逐个移动。这种形式也支持 OWNED BY,它将只移动指定角色所拥有的表。如果指 定了NOWAIT选项,则命令将在无法立刻获得所有所需 要的锁时失败。注意这个命令不移动系统目录,如果想要移动系统目录,应 该用ALTER DATABASE或者显式的 ALTER TABLE调用。对于这种形式来说, information_schema关系不被认为是系统目录的一部分, 因此它们将会被移动。另见CREATE TABLESPACE

SET { LOGGED | UNLOGGED }

这种形式将表从unlogged改为logged或者反过来 (参阅)。不能应用于临时表。

SET ( storage_parameter = value [, ... ] )

这种形式为该表更改一个或者更多存储参数。可用的参数请见 。注意这个 命令将不会立刻修改表内容,这取决于重写表以得到想要的结果可能需要的 参数。可以用VACUUM FULL、CLUSTER或者 ALTER TABLE的一种形式来强制一次表重写。 对于与规划器相关的参数,更改将在下次表锁定时生效, 因此当前执行的查询不会受到影响。

对于fillfactor和autovacuum存储参数以及以下规划器相关参数, 将采用SHARE UPDATE EXCLUSIVE锁: effective_io_concurrency、parallel_workers、seq_page_cost、 random_page_cost、n_distinct和n_distinct_inherited。

注意

------分隔线----------------------------