以文本方式查看主题

-  搭建论坛  (http://bbs.diylsoft.com:8118/starforum/index.asp)
--  数据库交流  (http://bbs.diylsoft.com:8118/starforum/list.asp?boardid=6)
----  [求助]怎么用SQL语句获得并修改数据库结构?  (http://bbs.diylsoft.com:8118/starforum/dispbbs.asp?boardid=6&id=26120)

--  作者:引力波
--  发布时间:2009-9-1 15:26:24
--  [求助]怎么用SQL语句获得并修改数据库结构?

大家好!

我近期一直在规划一个项目,这个项目的数据库往往因为全国各地的情况不一样,而需要相应的动态修改数据库。这个修改过程最好是用户自己修改!

现在的问题是:一、怎么用SQL语句获得数据库结构?二、能否提供动态修改数据库结构的实例?

第一个问题如果解决了,第二个问题我想就好办了。我在网上查了,书里找了,没有好的答案,还要请公司和大家帮助,这个问题应该具有普遍意义,如果实现了,大家都可以受益!


--  作者:admin
--  发布时间:2009-9-1 21:00:02
--  

直接使用“ALTER TABLE”SQL语句

名称

ALTER TABLE — 更改表属性

ALTER TABLE table [ * ]
    ADD [ COLUMN ] column type
ALTER TABLE table [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE table [ * ]
    RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO newtable
  

输入

table
试图更改的现存表的名称.
column
现存或新的列名称.
type
新列的类型.
newcolumn
现存列的新名称.
newtable
表的新名称.

输出

ALTER
从被更名的列或表返回的信息.
ERROR
如果一个列或表不存在返回的信息.

描述

ALTER TABLE 变更一个现存表的定义.ADD COLUMN 形式用与 CREATE TABLE 一样的语法向表中增加一个新列/字段。ALTER COLUMN 形式允许你从列/字段中设置或者删除缺省(值)。注意缺省(值)只对新插入的行有效。RENAME 子句可以在不影响相关表中任何数据的情况下更改一个表或者列/字段的名称。因此,表或列/字段在此命令执行后仍将是相同尺寸和类型。

如果要改变表的属性,你必须是表的所有者.

注意

COLUMN 关键字是多余的,可以省略.

如果“*” 跟在一个表名后面,表示该命令要对该表和所有继承级别低于该表的表进行操作;缺省时,该属性(更改)不会增加到任何子表或修改任何子表的相关名称。当增加或修改一个超级表(译注:继承级别高的表)的属性时总是应该这样的。否则,象下面这样的在继承级上进行的查询

SELECT NewColumn FROM SuperClass*
    

将不能工作,因为子表会比超级表少一个属性。

在目前的实现里,新列/字段的缺省(值)和约束子句会被忽略。你可以随后用 ALTER TABLESET DEFAULT 形式设置缺省(值)。(你还不得不用 UPDATE 把已存在行更新为缺省值。)

要修改表的结构,你必须是表的所有人。不允许更改系统表结构的任何部分。PostgreSQL 用户手册 里有关于继承的更多信息.

请参考 CREATE TABLE 部分获取更多有效参数的描述.

用法

向表中增加一个 VARCHAR 列:

ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
   

对现存列改名:

ALTER TABLE distributors RENAME COLUMN address TO city;
   

对现存表改名:

ALTER TABLE distributors RENAME TO suppliers;
   

兼容性

SQL92

ADD COLUMN 形式是兼容的,除了上面说的缺省(值)和约束外。ALTER COLUMN 形式是完全兼容的。

SQL92 对 ALTER TABLE 声明了一些附加的Postgres目前还不支持的功能:

ALTER TABLE table ADD table constraint definition
ALTER TABLE table DROP CONSTRAINT constraint { RESTRICT | CASCADE }
      
增加或删除表的约束(比如象检查约束,唯一约束或外键约束)。要创建或删除一个唯一约束,对应地创建或删除一个唯一索引(参阅 CREATE INDEX )。要修改其他类型的约束,你需要重建和重载该表,使用 CREATE TABLE 的其他参数。

例如,删除表 distributors 的任何约束:

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
       
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
      
当前,要删除一个现存的列,表必须重新创建和重新装载:
CREATE TABLE temp AS SELECT did, city FROM distributors;    
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
       

重命名列/字段和表名是 PostgreSQL 扩展。SQL92 没有提供这些。


--  作者:引力波
--  发布时间:2009-9-1 22:15:00
--  
非常好,谢谢ADMIN!我来学习一下。图片点击可在新窗口打开查看
--  作者:引力波
--  发布时间:2009-9-3 7:57:26
--  
再问:怎样能得到当前数据库某一字段的数据类型?