Oracle11g Oracle 11g express-选择插入列的位置?

Oracle11g Oracle 11g express-选择插入列的位置?,oracle11g,Oracle11g,假设我的表Tb中已经有3列A、B、C。我想在B和C之间添加一个新的列M。我怎么做 在添加M之后,我的表应该看起来像-abmc而不是bcm?简单的答案是不能。列始终添加在末尾。但是,您不应该关心表中列的顺序,因为您应该始终在查询和DML中显式列出列。您应该始终拥有一个接口层(例如视图),如果顺序很重要,您可以在该层中的适当位置添加新列 如果确实确定了,可以使用新列顺序创建新表,将数据移动到新表,删除旧表,然后重命名新表。您需要在表上重新创建任何索引、约束或触发器。差不多 ALTER TABLE t

假设我的表Tb中已经有3列A、B、C。我想在B和C之间添加一个新的列M。我怎么做


在添加M之后,我的表应该看起来像-abmc而不是bcm?

简单的答案是不能。列始终添加在末尾。但是,您不应该关心表中列的顺序,因为您应该始终在查询和DML中显式列出列。您应该始终拥有一个接口层(例如视图),如果顺序很重要,您可以在该层中的适当位置添加新列

如果确实确定了,可以使用新列顺序创建新表,将数据移动到新表,删除旧表,然后重命名新表。您需要在表上重新创建任何索引、约束或触发器。差不多

ALTER TABLE tb
  ADD( M NUMBER );

CREATE TABLE tb_new
AS
SELECT a, b, m, c
  FROM tb;

DROP TABLE tb;

ALTER TABLE tb_new 
  RENAME TO tb;
我不确定它是否是express edition中的一个选项(我倾向于怀疑它是否是,但我手头没有XE数据库可供验证),但您也可以使用,如Barbara在该示例中所示。在幕后,Oracle所做的工作与上面所做的基本相同,但添加了一些物化视图日志,以允许应用程序在操作期间继续访问表


但是,如果您发现自己关心表中列的顺序,那么最好停下来找出自己做错了什么,而不是继续沿着这两条路径前进。您关心表中列的物理顺序应该是非常罕见的。

简单的答案是您不能。列始终添加在末尾。但是,您不应该关心表中列的顺序,因为您应该始终在查询和DML中显式列出列。您应该始终拥有一个接口层(例如视图),如果顺序很重要,您可以在该层中的适当位置添加新列

如果确实确定了,可以使用新列顺序创建新表,将数据移动到新表,删除旧表,然后重命名新表。您需要在表上重新创建任何索引、约束或触发器。差不多

ALTER TABLE tb
  ADD( M NUMBER );

CREATE TABLE tb_new
AS
SELECT a, b, m, c
  FROM tb;

DROP TABLE tb;

ALTER TABLE tb_new 
  RENAME TO tb;
我不确定它是否是express edition中的一个选项(我倾向于怀疑它是否是,但我手头没有XE数据库可供验证),但您也可以使用,如Barbara在该示例中所示。在幕后,Oracle所做的工作与上面所做的基本相同,但添加了一些物化视图日志,以允许应用程序在操作期间继续访问表


但是,如果您发现自己关心表中列的顺序,那么最好停下来找出自己做错了什么,而不是继续沿着这两条路径前进。您关心表中列的物理顺序应该是非常非常罕见的。

justin-您能给我举一个列的物理顺序变得重要的罕见情况的例子吗?@breadbutter-大多数时候,人们关心列的顺序是因为构建的应用程序很差。如果一个构建良好的应用程序希望在表的末尾放置一些通常为
NULL
的列,以利用Oracle在这种情况下提供的一点压缩,那么它可能会关心表中列的顺序。但是,很少有人会使用一个数据模型,其中表中有几十个大部分为
NULL
列,或者您会关心节省的存储字节数。justin-您能给我举一个罕见的例子,说明列的物理顺序变得重要吗?@breadbutter-大多数情况下,人们关心列的顺序,因为构建的应用程序很差。如果一个构建良好的应用程序希望在表的末尾放置一些通常为
NULL
的列,以利用Oracle在这种情况下提供的一点压缩,那么它可能会关心表中列的顺序。但是,很少会使用一个数据模型,其中一个表中有几十列(大部分为
NULL
列),或者您会关心所提供的几字节存储节省。