PostgreSQL修改数据库表的列属性(ALTER语句)
一,修改表 PostgreSQL 提供了一族命令用于修改现有表。 可以实现: 增加字段, 删除字段, 增加约束, 删除约束, 修改默认, 重命名字段, 重命名表。 这些操作可以用:ALTER TABLE命令执行的。 1,增加字段 要增加一个字段,使用这条命令: ALTER TABLE p
一,修改表
PostgreSQL 提供了一族命令用于修改现有表。
可以实现:
增加字段,
删除字段,
增加约束,
删除约束,
修改默认值,
重命名字段,
重命名表。
这些操作可以用:ALTER TABLE命令执行的。
1,增加字段
要增加一个字段,使用这条命令:
ALTER TABLE products ADD COLUMN description text;
新增的字段对于表中已经存在的行而言最初将先填充空值。
你也可以同时在该字段上定义约束,使用通常的语法:
ALTER TABLE products ADD COLUMN description text CHECK (description '');
一个新字段不能用非空约束,因为最初的时候该字段必须包含空值。 但是你可以稍后增加一个非空约束。同样,你也不能在一个新字段 上定义默认值。根据 SQL 标准的说明,这样需要对现存行的新 字段填充默认值,而这个特性还没有实现。但是你可以稍后调整 字段预设。
2,删除字段
除一个字段:
ALTER TABLE products DROP COLUMN description;
3,增加约束
要增加一个约束,使用表约束语法。比如:
代码示例:
ALTER TABLE products ADD CHECK (name '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
要增加一个不能写成表约束的非空约束,使用下面语法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
这个约束将立即进行检查,所以表在加入约束之前必须符合约束条件。
4,删除约束
要删除一个约束,你需要知道它的名字。如果你给了它一个名字, 那么事情就好办了。
否则系统会分配一个生成的名字,这样你就需要 把它找出来了。psql 的命令 \d tablename 在这儿可以帮忙﹔
其它接口可能也提供了检查表的细节的方法。
命令:
ALTER TABLE products DROP CONSTRAINT some_name;
除了非空约束外,所有约束类型都这么用。要删除非空类型,用
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(要记得非空约束没有名字。)
5,改变默认值
要给一个字段设定默认值,使用一个象下面这样的命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
要删除默认值,用
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
这样相当于把预设设定为空,至少在 PostgreSQL里是这样的。
如果删除一个还没有定义的默认值不算错误,因为预设隐含就是空值。
6,给字段改名字
重命名一个字段:
ALTER TABLE products RENAME COLUMN product_no TO product_number;
7,给表改名字
代码示例:
To rename a table:
ALTER TABLE products RENAME TO items;
Name
ALTER TABLE -- 修改表的定义Synopsis
<span style="word-wrap:break-word; padding:0px; margin:0px"><br style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE [ ONLY ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">name</span></tt> [ * ]<br style="word-wrap:break-word; padding:0px; margin:0px"> <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">action</span></tt> [, ... ]<br style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE [ ONLY ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">name</span></tt> [ * ]<br style="word-wrap:break-word; padding:0px; margin:0px"> RENAME [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> TO <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">new_column</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">name</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> RENAME TO <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">new_name</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">name</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> SET SCHEMA <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">new_schema</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"><br style="word-wrap:break-word; padding:0px; margin:0px">这里 <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">action</span></tt> 是下列之一:<br style="word-wrap:break-word; padding:0px; margin:0px"><br style="word-wrap:break-word; padding:0px; margin:0px"> ADD [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">type</span></tt> [ <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column_constraint</span></tt> [ ... ] ]<br style="word-wrap:break-word; padding:0px; margin:0px"> DROP [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> [ RESTRICT | CASCADE ]<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> TYPE <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">type</span></tt> [ USING <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">expression</span></tt> ]<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> SET DEFAULT <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">expression</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> DROP DEFAULT<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> { SET | DROP } NOT NULL<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> SET STATISTICS <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">integer</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER [ COLUMN ] <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">column</span></tt> SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }<br style="word-wrap:break-word; padding:0px; margin:0px"> ADD <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">table_constraint</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> DROP CONSTRAINT <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">constraint_name</span></tt> [ RESTRICT | CASCADE ]<br style="word-wrap:break-word; padding:0px; margin:0px"> DISABLE TRIGGER [ <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">trigger_name</span></tt> | ALL | USER ]<br style="word-wrap:break-word; padding:0px; margin:0px"> ENABLE TRIGGER [ <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">trigger_name</span></tt> | ALL | USER ]<br style="word-wrap:break-word; padding:0px; margin:0px"> CLUSTER ON <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">index_name</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> SET WITHOUT CLUSTER<br style="word-wrap:break-word; padding:0px; margin:0px"> SET WITHOUT OIDS<br style="word-wrap:break-word; padding:0px; margin:0px"> OWNER TO <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">new_owner</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> SET TABLESPACE <tt class="REPLACEABLE" style="word-wrap:break-word; padding:0px; margin:0px"><span style="word-wrap:break-word; padding:0px; margin:0px">new_tablespace</span></tt><br style="word-wrap:break-word; padding:0px; margin:0px"> </span>
描述
ALTER TABLE 变更一个现存表的定义。它有好几种子形式:
- ADD COLUMN
-
这种形式用和 CREATE TABLE 里一样的语法向表中增加一个新的字段。
- DROP COLUMN
-
这种形式从表中删除一个字段。请注意,和这个字段相关的索引和表约束也会被自动删除。 如果任何表之外的对象依赖于这个字段, 你必须说CASCADE,比如,外键参考,视图等等。
- ALTER COLUMN TYPE
-
这种类型改变表中一个字段的类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型, 方法是重新分析最初提供的表达式。可选的 USING 子句声明如何从旧的字段值里计算新的字段值; 如果省略,那么缺省的转换就是从旧类型像新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换, 那么必须提供一个 USING。
- SET/DROP DEFAULT
-
这种形式为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的 INSERT 命令; 它们不会导致已经在表中的行的数值的修改。我们也可以为视图创建缺省, 这个时候它们是在视图的 ON INSERT 规则应用之前插入 INSERT 语句中去的。
- SET/DROP NOT NULL
-
这些形式修改一个字段是否标记为允许 NULL 值或者是拒绝 NULL 值。 如果表在字段中包含非空值,那么你只可以 SET NOT NULL。
- SET STATISTICS
-
这个形式为随后的 ANALYZE 操作设置每字段的统计收集目标(default_statistics_target)。 目标的范围可以在 0 到 1000 之内设置;另外,把他设置为 -1 则表示重新恢复到使用系统缺省的统计目标。 有关 PostgreSQL 查询规划器使用的统计信息的更多信息, 请参考Section 13.2。
- SET STORAGE
-
这种形式为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。 PLAIN 必需用于定长的数值,比如 integer,并且是内联的,不压缩的。 MAIN 用于内联,可压缩的数据。 EXTERNAL 用于外部保存,不压缩的数据, 而 EXTENDED 用于外部的压缩数据。 EXTENDED 是大多数支持非 PLAIN 存储的数据之缺省。 使用 EXTERNAL 将令在 text 字段上的子字串操作更快, 付出的代价是增加了存储空间。 请注意 SET STORAGE 本身并不改变表上的任何东西, 只是设置将来的表操作时,建议使用的策略。参阅 Section 50.2 获取更多信息。
- ADD table_constraint
-
这个形式给表增加一个新的约束,用的语法和 CREATE TABLE 一样。
- DROP CONSTRAINT
-
这个形式删除一个表上的约束。 目前,在表上的约束不要求有唯一的名字,因此可能有多个约束匹配声明的名字。 所有这样的约束都将被删除。
- DISABLE/ENABLE TRIGGER
-
这个形式关闭或者打开属于该表的触发器。 一个被关闭掉的触发器是系统仍然知道的,但是在触发器事件发生的时候不会被执行。 对于一个推迟了的触发器,在事件发生的时候会检查打开状态,而不是在函数实际执行的时候。 我们可以通过申明名字的方法打开或者关闭任意一个触发器, 或者是该表上的所有触发器,或者只是用户触发器(这个选项排除了那些用于实现外键约束的触发器)。 打开或者关闭约束触发器要求超级用户权限; 这么做的时候应该小心,因为如果触发器不执行的话,约束保证的数据完整性也就没有办法确保了。
- CLUSTER
-
这种形式为将来的 CLUSTER 选项选择缺省索引。它实际上并不重新对表建簇。
- SET WITHOUT CLUSTER
-
这种形式从表中删除最新使用的 CLUSTER 索引。 这样会影响将来那些没有声明索引的建簇操作。
- SET WITHOUT OIDS
-
这种形式从表中删除 oid 系统字段。 它和 DROP COLUMN oid RESTRICT 完全相同, 只不过是如果表上已经没有 oid 字段了,那么它不会报告错误。
请注意,不存在某种 ALTER TABLE 的变种可以在删除了 OID 之后再把它们恢复回来。
- RENAME
-
RENAME 形式改变一个表的名字(或者是一个索引,一个序列,或者一个视图)或者是表中一个独立字段的名字。 它对存储的数据没有任何影响。
- OWNER
-
这个形式改变表,序列或者视图的所有者为指定所有者。
- SET TABLESPACE
-
这种形式把表的表空间修改为指定的表空间并且把与表相关的数据文件移动到新的表空间去。 如果在表上呦索引,则不会移动。但是他们可以通过额外的 SET TABLESPACE 命令移动。参阅 CREATE TABLESPACE。
- RENAME
-
RENAME 形式改变一个表(或者一个索引,序列,或者视图)的名字, 或者是表中独立字段的名字。它们对存储的数据没有影响。
- SET SCHEMA
-
这种形式把表移动到另外一个模式。相关的索引,约束,以及 SERIAL 字段的序列都跟着移动。
除了 RENAME 和 SET SCHEMA 之外所有动作都可以捆绑再一个多次修改的列表中同时施用。 比如,我们可以在一个命令里增加几个字段和/或修改几个字段的类型。 对于大表,这么做特别有用,因为只需要对该表做一次处理。
要使用 ALTER TABLE,你必需拥有该表。 要修改一个表的模式,你必须在新的模式上有 CREATE 权限。要修改所有者,你必须还是新的所有角色的直接或者间接的成员, 并且该角色在该表的模式上必须拥有 CREATE 权限。 (这样的限制就保证了修改所有者这个动作和删除、重建该表能做到的动作没有什么区别。 不过,超级用户可以修改任何表的所有者。)
参数
- table
-
试图更改的现存表(可能有模式修饰)的名称。 如果声明了 ONLY,则只更改该表。 如果没有声明 ONLY,则该表及其所有后代表(如果有)都被更新。 我们可以在表名字后面附加一个 * 表示后代表都被扫描,但是在目前的版本里,这是缺省行为。 (在7.1之前的版本,ONLY 是缺省的行为。)缺省可以通过改变配置选项 sql_inheritance 来改变。
- column
-
现存或新的字段名称。
- new_column
-
现存字段的新名称。
- new_name
-
表的新名称。
- type
-
新字段的类型,或者现存字段的新类型。
- table_constraint
-
表的新的约束定义。
- constraint_name
-
要删除的现有约束的名字。
- trigger_name
-
要打开或者关闭的单个触发器的名字。
- ALL
-
打开或者关闭属于该表的所有触发器。 (如果这些触发器中有外键约束,那么就要求超级用户权限。)
- USER
-
打开或者关闭所有属于该表的非外键约束触发器。
- index_name
-
要标记为建簇的表上面的索引名字。
- CASCADE
-
自动删除依赖于被依赖字段或者约束的对象(比如,引用该字段的视图)。
- RESTRICT
-
如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。 这是缺省行为。
- new_owner
-
该表的新所有者的用户名。
- new_tablespace
-
这个表将要移动往的表空间名字。
- new_schema
-
表将移动前往的模式的名字。
注意
COLUMN 关键字是多余的,可以省略。
如果用 ADD COLUMN 增加一个字段,那么所有表中现有行都初始化为该字段的缺省值 (如果没有声明 DEFAULT 子句,那么就是 NULL)。
用一个非空缺省增加一个字段或者是改变一个字段的现有类型会要求整个表的重写。 对于大表来说,这个操作可能会花很长时间;并且它还临时需要两倍的磁盘空间。
增加一个 CHECK 或者 NOT NULL 约束要求扫描该表以保证现有的行复合约束要求。
提供在一个 ALTER TABLE 里面声明多个修改的主要原因是原先需要的对表的多次扫描和重写可以组合成一个回合。
DROP COLUMN 命令并不是物理上把字段删除, 而只是简单地把它标记为 SQL 操作中不可见的。随后对该表的插入和更新将在该字段存储一个 NULL。 因此,删除一个字段是很快的,但是它不会立即缩减你的表在磁盘上的大小,因为被删除了的字段占据的空间还没有回收。 这些空间将随着现有的行的更新而得到回收。
ALTER TYPE 要求重写整个表的特性有时候是一个优点, 因为重写的过程消除了任何表中的没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间, 最快的方法是
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE table ALTER COLUMN anycol TYPE anytype;</span>
这里 anycol 是任何在表中还存在的字段,而 anytype 是和该字段的原类型一样的类型。 这样的结果是在表上没有任何可见的语意的变化,但是这个命令强迫重写,这样就删除了不再使用的数据。
ALTER TYPE 的 USING 选项实际上可以声明涉及该行旧值的任何表达式; 也就是说,它可以引用除了正在被转换的字段之外其它的字段。这样,我们就可以用 ALTER TYPE 语法做非常普遍性的转换。因为这个灵活性,USING 表达式并没有施用于该字段的缺省值(如果有的话); 结果可能不是缺省表达式要求的常量表达式。 这就意味着如果从旧类型到新类型如果没有隐含或者赋值转换的话, 那么即使存在 USING 子句的情况下, ALTER TYPE 也可能无法把缺省值转换成新的类型。 在这种情况下,我们应该用 DROP DEFAULT 先删除缺省, 执行 ALTER TYPE,然后使用 SET DEFAULT 增加一个合适的新缺省。 类似的考虑也适用于涉及该字段的索引和约束。
如果表有任何后代表,那么如果不在后代表上做同样的修改的话, 就不允许在父表上增加,重命名或者修改一个字段的类型,也就是说, ALTER TABLE ONLY将被拒绝。这样就保证了后代表总是有和父表匹配的字段。
一个递归DROP COLUMN 操作将只有在后代表并不从任何其它父表中继承该字段并且从来没有独立定义该字段的时候才能删除一个后代表的字段。 一个非递归的DROP COLUMN(也就是,ALTER TABLE ONLY ... DROP COLUMN)从来不会删除任何后代字段, 而是把他们标记为独立定义的,而不是继承的。
TRIGGER,CLUSTER,OWNER,和 TABLESPACE 行为绝不会递归到后代表; 也就是说,它们的行为就像总是声明了 ONLY 一样。 添加一个约束只能在CHECK 约束上递归。
不允许更改系统表结构的任何部分。
请参考 CREATE TABLE 部分获取更多有效参数的描述。 Chapter 5 里有更多有关继承的信息。
例子
向表中增加一个 varchar 列:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ADD COLUMN address varchar(30);</span>
从表中删除一个字段:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors DROP COLUMN address RESTRICT;</span>
在一个操作中修改两个现有字段的类型:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER COLUMN address TYPE varchar(80),<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER COLUMN name TYPE varchar(100);</span>
使用一个 USING 子句, 把一个包含 UNIX 时间戳的 integer 字段转化成 timestamp with time zone:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE foo<br style="word-wrap:break-word; padding:0px; margin:0px"> ALTER COLUMN foo_timestamp TYPE timestamp with time zone<br style="word-wrap:break-word; padding:0px; margin:0px"> USING<br style="word-wrap:break-word; padding:0px; margin:0px"> timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';</span>
对现存字段改名:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors RENAME COLUMN address TO city;</span>
更改现存表的名字∶
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors RENAME TO suppliers;</span>
给一个字段增加一个非空约束:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;</span>
从一个字段里删除一个非空约束:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;</span>
给一个表增加一个检查约束:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);</span>
删除一个表和它的所有子表的监查约束:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors DROP CONSTRAINT zipchk;</span>
向表中增加一个外键约束:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL;</span>
给表增加一个(多字段)唯一约束:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);</span>
给一个表增加一个自动命名的主键约束,要注意的是一个表只能有一个主键:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors ADD PRIMARY KEY (dist_id);</span>
把表移动到另外一个表空间:
<span style="word-wrap:break-word; padding:0px; margin:0px">ALTER TABLE distributors SET TABLESPACE fasttablespace;</span>
把表移动到另外一个模式:

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. 먼저 딩톡을 실행하세요. 2. 그룹 채팅을 열고 오른쪽 상단에 있는 점 3개를 클릭하세요. 3. 이 그룹에서 내 닉네임을 찾아보세요. 4. 입력하여 수정하고 저장하려면 클릭하세요.

Go 언어는 효율적이고 간결하며 배우기 쉬운 프로그래밍 언어입니다. 동시 프로그래밍과 네트워크 프로그래밍의 장점 때문에 개발자들이 선호합니다. 실제 개발에서 데이터베이스 작업은 필수적인 부분입니다. 이 기사에서는 Go 언어를 사용하여 데이터베이스 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. Go 언어에서는 일반적으로 사용되는 SQL 패키지, Gorm 등과 같은 타사 라이브러리를 사용하여 데이터베이스를 운영합니다. 여기서는 sql 패키지를 예로 들어 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. MySQL 데이터베이스를 사용하고 있다고 가정합니다.

Xianyu 플랫폼에 제품을 게시할 때 사용자는 실제 상황에 따라 제품의 지리적 위치 정보를 맞춤화할 수 있으므로 잠재 구매자가 제품의 특정 위치를 보다 정확하게 파악할 수 있습니다. 제품이 성공적으로 선반에 올려지면 판매자의 위치가 변경되더라도 걱정할 필요가 없습니다. Xianyu 플랫폼은 유연하고 편리한 수정 기능을 제공합니다. 그러면 게시된 제품의 주소를 수정하려면 어떻게 해야 합니까? 이 튜토리얼 가이드에서는 자세한 단계별 가이드를 제공할 수 있기를 바랍니다. 도와주세요! Xianyu에서 출시 제품 주소를 수정하는 방법은 무엇입니까? 1. Xianyu를 열고 내가 게시한 내용을 클릭한 후 제품을 선택하고 편집을 클릭합니다. 2. 위치 아이콘을 클릭하고 설정하려는 주소를 선택하세요.

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

HTML은 데이터베이스를 직접 읽을 수 없지만 JavaScript 및 AJAX를 통해 읽을 수 있습니다. 단계에는 데이터베이스 연결 설정, 쿼리 보내기, 응답 처리 및 페이지 업데이트가 포함됩니다. 이 기사에서는 JavaScript, AJAX 및 PHP를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 실제 예제를 제공하고 쿼리 결과를 HTML 페이지에 동적으로 표시하는 방법을 보여줍니다. 이 예제에서는 XMLHttpRequest를 사용하여 데이터베이스 연결을 설정하고 쿼리를 보내고 응답을 처리함으로써 페이지 요소에 데이터를 채우고 데이터베이스를 읽는 HTML 기능을 실현합니다.

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())
