📄 alter_table.sgml
字号:
Data type of the new column, or new data type for an existing column. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">table_constraint</replaceable></term> <listitem> <para> New table constraint for the table. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">constraint_name</replaceable></term> <listitem> <para> Name of an existing constraint to drop. </para> </listitem> </varlistentry> <varlistentry> <term><literal>CASCADE</literal></term> <listitem> <para> Automatically drop objects that depend on the dropped column or constraint (for example, views referencing the column). </para> </listitem> </varlistentry> <varlistentry> <term><literal>RESTRICT</literal></term> <listitem> <para> Refuse to drop the column or constraint if there are any dependent objects. This is the default behavior. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">trigger_name</replaceable></term> <listitem> <para> Name of a single trigger to disable or enable. </para> </listitem> </varlistentry> <varlistentry> <term><literal>ALL</literal></term> <listitem> <para> Disable or enable all triggers belonging to the table. (This requires superuser privilege if any of the triggers are for foreign key constraints.) </para> </listitem> </varlistentry> <varlistentry> <term><literal>USER</literal></term> <listitem> <para> Disable or enable all triggers belonging to the table except for foreign key constraint triggers. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">index_name</replaceable></term> <listitem> <para> The index name on which the table should be marked for clustering. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">new_owner</replaceable></term> <listitem> <para> The user name of the new owner of the table. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">new_tablespace</replaceable></term> <listitem> <para> The name of the tablespace to which the table will be moved. </para> </listitem> </varlistentry> <varlistentry> <term><replaceable class="PARAMETER">new_schema</replaceable></term> <listitem> <para> The name of the schema to which the table will be moved. </para> </listitem> </varlistentry> </variablelist> </refsect1> <refsect1> <title>Notes</title> <para> The key word <literal>COLUMN</literal> is noise and can be omitted. </para> <para> When a column is added with <literal>ADD COLUMN</literal>, all existing rows in the table are initialized with the column's default value (NULL if no <literal>DEFAULT</> clause is specified). </para> <para> Adding a column with a non-null default or changing the type of an existing column will require the entire table to be rewritten. This may take a significant amount of time for a large table; and it will temporarily require double the disk space. </para> <para> Adding a <literal>CHECK</> or <literal>NOT NULL</> constraint requires scanning the table to verify that existing rows meet the constraint. </para> <para> The main reason for providing the option to specify multiple changes in a single <command>ALTER TABLE</> is that multiple table scans or rewrites can thereby be combined into a single pass over the table. </para> <para> The <literal>DROP COLUMN</literal> form does not physically remove the column, but simply makes it invisible to SQL operations. Subsequent insert and update operations in the table will store a null value for the column. Thus, dropping a column is quick but it will not immediately reduce the on-disk size of your table, as the space occupied by the dropped column is not reclaimed. The space will be reclaimed over time as existing rows are updated. </para> <para> The fact that <literal>ALTER TYPE</> requires rewriting the whole table is sometimes an advantage, because the rewriting process eliminates any dead space in the table. For example, to reclaim the space occupied by a dropped column immediately, the fastest way is<programlisting>ALTER TABLE table ALTER COLUMN anycol TYPE anytype;</programlisting> where <literal>anycol</> is any remaining table column and <literal>anytype</> is the same type that column already has. This results in no semantically-visible change in the table, but the command forces rewriting, which gets rid of no-longer-useful data. </para> <para> The <literal>USING</literal> option of <literal>ALTER TYPE</> can actually specify any expression involving the old values of the row; that is, it can refer to other columns as well as the one being converted. This allows very general conversions to be done with the <literal>ALTER TYPE</> syntax. Because of this flexibility, the <literal>USING</literal> expression is not applied to the column's default value (if any); the result might not be a constant expression as required for a default. This means that when there is no implicit or assignment cast from old to new type, <literal>ALTER TYPE</> may fail to convert the default even though a <literal>USING</literal> clause is supplied. In such cases, drop the default with <literal>DROP DEFAULT</>, perform the <literal>ALTER TYPE</>, and then use <literal>SET DEFAULT</> to add a suitable new default. Similar considerations apply to indexes and constraints involving the column. </para> <para> If a table has any descendant tables, it is not permitted to add, rename, or change the type of a column in the parent table without doing the same to the descendants. That is, <command>ALTER TABLE ONLY</command> will be rejected. This ensures that the descendants always have columns matching the parent. </para> <para> A recursive <literal>DROP COLUMN</literal> operation will remove a descendant table's column only if the descendant does not inherit that column from any other parents and never had an independent definition of the column. A nonrecursive <literal>DROP COLUMN</literal> (i.e., <command>ALTER TABLE ONLY ... DROP COLUMN</command>) never removes any descendant columns, but instead marks them as independently defined rather than inherited. </para> <para> The <literal>TRIGGER</>, <literal>CLUSTER</>, <literal>OWNER</>, and <literal>TABLESPACE</> actions never recurse to descendant tables; that is, they always act as though <literal>ONLY</> were specified. Adding a constraint can recurse only for <literal>CHECK</> constraints. </para> <para> Changing any part of a system catalog table is not permitted. </para> <para> Refer to <xref linkend="sql-createtable" endterm="sql-createtable-title"> for a further description of valid parameters. <xref linkend="ddl"> has further information on inheritance. </para> </refsect1> <refsect1> <title>Examples</title> <para> To add a column of type <type>varchar</type> to a table:<programlisting>ALTER TABLE distributors ADD COLUMN address varchar(30);</programlisting> </para> <para> To drop a column from a table:<programlisting>ALTER TABLE distributors DROP COLUMN address RESTRICT;</programlisting> </para> <para> To change the types of two existing columns in one operation:<programlisting>ALTER TABLE distributors ALTER COLUMN address TYPE varchar(80), ALTER COLUMN name TYPE varchar(100);</programlisting> </para> <para> To change an integer column containing UNIX timestamps to <type>timestamp with time zone</type> via a <literal>USING</literal> clause:<programlisting>ALTER TABLE foo ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';</programlisting> </para> <para> To rename an existing column:<programlisting>ALTER TABLE distributors RENAME COLUMN address TO city;</programlisting> </para> <para> To rename an existing table:<programlisting>ALTER TABLE distributors RENAME TO suppliers;</programlisting> </para> <para> To add a not-null constraint to a column:<programlisting>ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;</programlisting> To remove a not-null constraint from a column:<programlisting>ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;</programlisting> </para> <para> To add a check constraint to a table:<programlisting>ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);</programlisting> </para> <para> To remove a check constraint from a table and all its children:<programlisting>ALTER TABLE distributors DROP CONSTRAINT zipchk;</programlisting> </para> <para> To add a foreign key constraint to a table:<programlisting>ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;</programlisting> </para> <para> To add a (multicolumn) unique constraint to a table:<programlisting>ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);</programlisting> </para> <para> To add an automatically named primary key constraint to a table, noting that a table can only ever have one primary key:<programlisting>ALTER TABLE distributors ADD PRIMARY KEY (dist_id);</programlisting> </para> <para> To move a table to a different tablespace:<programlisting>ALTER TABLE distributors SET TABLESPACE fasttablespace;</programlisting> </para> <para> To move a table to a different schema:<programlisting>ALTER TABLE myschema.distributors SET SCHEMA yourschema;</programlisting> </para> </refsect1> <refsect1> <title>Compatibility</title> <para> The <literal>ADD</literal>, <literal>DROP</>, and <literal>SET DEFAULT</> forms conform with the SQL standard. The other forms are <productname>PostgreSQL</productname> extensions of the SQL standard. Also, the ability to specify more than one manipulation in a single <command>ALTER TABLE</> command is an extension. </para> <para> <command>ALTER TABLE DROP COLUMN</> can be used to drop the only column of a table, leaving a zero-column table. This is an extension of SQL, which disallows zero-column tables. </para> </refsect1></refentry><!-- Keep this comment at the end of the fileLocal variables:mode: sgmlsgml-omittag:nilsgml-shorttag:tsgml-minimize-attributes:nilsgml-always-quote-attributes:tsgml-indent-step:1sgml-indent-data:tsgml-parent-document:nilsgml-default-dtd-file:"../reference.ced"sgml-exposed-tags:nilsgml-local-catalogs:"/usr/lib/sgml/catalog"sgml-local-ecat-files:nilEnd:-->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -