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

ALTER TABLE

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

ALTER TABLE更改一个现有表的定义。下文描述了 几种形式。注意每一种形式所要求的锁级别可能不同。如果没有明确说明,将会 持有一个ACCESS EXCLUSIVE所。当列出多个子命令时,所 持有的锁将是子命令所要求的最严格的那一个。

ADD COLUMN [ IF NOT EXISTS ]

这种形式向该表增加一个新列,使用与 CREATE TABLE相同的语法。如果指定了 IF NOT EXISTS并且使用这个名字的列已经存在,则 不会抛出错误。

DROP COLUMN [ IF EXISTS ]

这种形式从表删除一列。涉及到该列的索引和表约束也将会被自动 删除。如果删除列会导致统计信息仅包含单个列的数据, 那么引用删除列的多变量统计信息也将被删除。 如果在该表之外有任何东西(例如外键引用或者视图)依赖 于该列,你将需要用到CASCADE。如果指定了 IF EXISTS但该列不存在,则不会抛出错误。 这种情况中会发出一个提示。

SET DATA TYPE

这种形式更改表中一列的类型。涉及到该列的索引和简单表约束将通过 重新解析最初提供的表达式被自动转换为使用新的列类型。可选的 COLLATE子句为新列指定一种排序规则,如果被省略, 排序规则会是新列类型的默认排序规则。可选的USING 子句指定如何从旧的列值计算新列值,如果被省略,默认的转换和从旧类型 到新类型的赋值造型一样。如果没有从旧类型到新类型的隐式或者赋值造型, 则必须提供一个USING子句。

SET/DROP DEFAULT

这些形式为一列设置或者移除默认值。默认值只在后续的 INSERT或UPDATE命令中生效, 它们不会导致已经在表中的行改变。

SET/DROP NOT NULL

这些形式更改一列是否被标记为允许空值或者拒绝空值。只有当该列 不包含空值时,你才能使用SET NOT NULL。

如果这个表是一个分区,如果在父表中标记了NOT NULL, 则不能在列上执行DROP NOT NULL。 要从所有分区中删除NOT NULL约束, 请在父表上执行DROP NOT NULL。即使父表没有 NOT NULL约束,如果需要,这样的约束仍然可以添加到单个分区; 也就是说,即使父表允许,子表也可以不允许为空,但是反过来不行。

ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]

这些形式会更改列是否为标识列或更改现有标识列的生成属性。 有关详细信息,请参见CREATE TABLE

如果指定了DROP IDENTITY IF EXISTS,并且该列不是标识列, 则不会抛出错误。在这种情况下,发出一个通知。

SET sequence_option
RESTART

这些形式修改现有标识列下的序列。sequence_option 是一个由ALTER SEQUENCE支持的选项, 例如INCREMENT BY。

SET STATISTICS

这种形式为后续的ANALYZE操作设置针对每列 的统计收集目标。目标可以被设置在范围 0 到 10000 之间,还可以 把它设置为 -1 来恢复到使用系统默认的统计目标( )。更多有关 PostgreSQL查询规划器使用统计 信息的内容可见第14.2节。

SET STATISTICS要求一个SHARE UPDATE EXCLUSIVE锁。

SET ( attribute_option = value [, ... ] )
RESET ( attribute_option [, ... ] )

这种形式设置或者重置每个属性的选项。当前,已定义的针对每个属性的 选项只有n_distinct和n_distinct_inherited, 它们会覆盖后续ANALYZE操作所得到的可区分值数量 估计。n_distinct影响该表本身的统计信息,而 n_distinct_inherited影响为该表外加其继承子女收集的统计信息。 当被设置为一个正值时,ANALYZE将假定该列刚好包含指定 数量的可区分非空值。当被设置为一个负值(必须大于等于 -1)时, ANALYZE将假定可区分非空值的数量与表的尺寸成线性比例, 确切的计数由估计的表尺寸乘以给定数字的绝对值计算得到。例如,值 -1 表示 该列中所有的值都是可区分的,而值 -0.5 则表示每一个值平均出现两次。当表 的尺寸随时间变化时,这会有所帮助,因为这种计算只有在查询规划时才会被 执行。指定值为 0 将回到正常的估计可区分值数量的做法。更多有关 PostgreSQL查询规划器使用统计 信息的内容可见第14.2节。

更改针对每个属性的选项要求一个 SHARE UPDATE EXCLUSIVE锁。

SET STORAGE

这种形式为一列设置存储模式。这会控制这列是会被保持在线内还是放在一个 二级TOAST表中,以及数据是否应被压缩。对于 integer之类的定长、线内、未压缩值必须使用 PLAIN。MAIN用于线内、可压缩的 数据。EXTERNAL用于外部的、未压缩数据。而 EXTENDED用于外部的、压缩数据。对于大部分支持 非-PLAIN存储的数据类型,EXTENDED 是默认值。使用EXTERNAL将会让很大的 text和bytea之上的子串操作运行得更快, 但是代价是存储空间会增加。注意SET STORAGE本身并不改变 表中的任何东西,它只是设置在未来的表更新时要追求的策略。详见 第66.2节。

ADD table_constraint [ NOT VALID ]

这种形式使用和CREATE TABLE相同的语法外加 NOT VALID选项为一个表增加一个新的约束,该选项 当前只被允许用于外键和 CHECK 约束。如果约束被标记为 NOT VALID,将会跳过验证表中所有行满足该约束的 初检,这种检查可能会很漫长。该约束仍将被强制到后续的插入和删除上 (也就是说,在外键的情况下如果在被引用表中没有一个匹配的行,操作 会失败;如果新行不匹配指定的检查约束,操作也会失败)。但是数据库 不会假定约束对该表中的所有行都成立,直到通过使用VALIDATE CONSTRAINT选项对它进行验证。

ADD table_constraint_using_index

这种形式基于一个已有的唯一索引为一个表增加新的 PRIMARY KEY或UNIQUE约束。该索引中的 所有列将被包括在约束中。

该索引不能有表达式列或者是一个部分索引。还有,它必须是一个带有 默认排序顺序的 B-树索引。这些限制确保该索引等效于使用常规 ADD PRIMARY KEY或者ADD UNIQUE命令 时创建的索引。

如果PRIMARY KEY被指定,并且该索引的列没有被标记 NOT NULL,那么这个命令将尝试对每一个这样的列做 ALTER COLUMN SET NOT NULL。这需要一次全表扫描 来验证这些列不包含空值。在所有其他情况中,这都是一种很快的操作。

如果提供了一个约束名,那么该索引将被重命名以匹配该约束名。否则 该约束将被命名成索引的名称。

这个命令被执行后,该索引被增加的约束拥有,这和用常规 ADD PRIMARY KEY或ADD UNIQUE命令 创建的索引一样。特别地,删掉该约束将会导致该索引也消失。

注意

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