考虑我在Oracle 10G中创建的这个初始表:
╔═════════════════════════════════╗
║ CUSTOMER_ID ACC_NO ACC_BALANCE ║
╠═════════════════════════════════╣
║ 100 200 1000 ║
║ 101 150 4000 ║
║ 102 350 2000 ║
║ 103 450 2500 ║
║ 104 550 2200 ║
╚═════════════════════════════════╝
现在我想在表格中添加另一列customer_name
。我用过:
ALTER TABLE BANK_ACCOUNT
ADD (CUSTOMER_NAME VARCHAR2(30));
并且正在插入列作为表中的最后一列,而我希望将列作为第二列添加到表中。现在我提到的SQL代码无法这样做。那么如何在指定位置添加列?它甚至可以在SQL中使用吗?
答案 0 :(得分:1)
它实际上不是重要列是物理上的,因为select
将允许您指定它们被检索的顺序(逻辑上)。
而且,如果您使用的select *
不允许您指定订单,那么您可能不应该这样做。您应该这样做的情况很少(例如,数据库分析工具),大多数情况下,最好选择所需的各个列,即使您需要它们。这使您可以快速捕获模式更改,以便您可以使程序适应它们。
在任何情况下,SQL本身都不保证返回列的顺序,除非您显式地列出它们。 select *
今天可以按顺序给你,明天按字母顺序给你。即使特定的实现允许你这样做(通过在“正确”的位置创建一个新表并将数据复制到一起,或提供像alter table T insert column C1 before C2
这样的SQL扩展),我建议不要这样做。它不能移植到其他实现中,我更喜欢让我的代码尽可能便携。
此外,除了您在SQL中指定的内容之外,DBMS应该能够完全控制 存储数据的方式。可能是您的主键是第七列和第四十二列的复合,将它们放在物理记录的前面可能更有效。