1,怎样定 数值类型MONEY 的精度 比如精确到千分位 (默认的是精确到万分位,好像)
2,行级的约束 怎样写取值范围的约束 比如说闭区间[0,100]  这样写对吗  CHECK <列名> IN(0,100)
3,怎样用SQL语句删除表  比如 DROP TABLE Table_Card 一执行就会说我没有权限,可我是系统管理员权限呀,更郁闷的是,我在编写这个问题的时候又试了一下,结果又可以了,还删除了一个我不想删的表。(都是自定义表,不是系统数据库表)。 这是为什么呀  一会可以一会不行的
4,修改表结构为什么会有这样的错误,和系统表的某个列重名不让改?
我建的表是这样的:
create table Table_Test
(
One int not null primary key,
Two char(2) null check (Two in('F','M')),
Three char(3) not null,
Four char(4) not null check (Four in('1','2','3','4')),
Five money null 
)修改语句是这样的:
alter table Table_Test alter column One money出错信息是这样的:
消息 5074,级别 16,状态 1,第 1 行
The object 'PK__Table_Test__4316F928' is dependent on column 'One'.
消息 4922,级别 16,状态 9,第 1 行
ALTER TABLE ALTER COLUMN One failed because one or more objects access this column.另外这个是可执行的alter table Table_Test alter column Two char(3)  --注意Two非主键
而这个是不可执行的alter table Table_Test alter column One char(3)  --注意One是主键 
这个不可执行alter table Table_Test alter column Two money  --注意Two非主键
这个也不行alter table Table_Test alter column Two int
错误信息都是这样的:
消息 5074,级别 16,状态 1,第 1 行
The object 'CK__Table_Test__Two__440B1D61' is dependent on column 'Two'.
消息 4922,级别 16,状态 9,第 1 行
ALTER TABLE ALTER COLUMN Two failed because one or more objects access this column.
这些究竟是为什么呀  我晕死了 这些问题如果选择用可视化的操作就都没有问题  为什么呀 因该等效的呀
5,建表遇到的问题
脚本:
CREATE TABLE Table_SaleBillDetail

SaleBillID VARCHAR(8) NOT NULL PRIMARY KEY ,
GoodID VARCHAR(8) NOT NULL REFERENCES Table_Goods(GoodID),
SaleUnitPrice MONEY NOT NULL REFERENCES Table_Goods(SaleUnitPrice),
Quantity INT NOT NULL ,
Amount MONEY NOT NULL ,
Discount INT NOT NULL CHECK (Discount IN (0,10)),
DiscountAmount MONEY NOT NULL ,
CHECK (DiscountAmount=Amount*(1-Discount)),
FOREIGN KEY (SaleBillID)REFERENCES Table_SaleBill(SaleBillID)
)出错信息:
消息 1776,级别 16,状态 0,第 1 行
There are no primary or candidate keys in the referenced table 'Table_Goods' that match the referencing column list in the foreign key 'FK__Table_Sal__SaleU__412EB0B6'.
消息 1750,级别 16,状态 0,第 1 行
Could not create constraint. See previous errors.可是在表'Table_Goods' 明明有GoodID 且数据类型一致

解决方案 »

  1.   

    1,money类型应该是不能手工指定的,如果需要指定精度的话,建议使用decimal类型;还可以使用cast或者convert进行转化;2,check(col>=0 and col <=100)3,会不会是对象不存在或者拼写错误,具体的提示信息又是什么?一般没有一会可以,一会不可以的情况发生。4,有约束的时候,需要禁用,或者删除,等修改完列后再添加约束5,goodid需要在表Table_Goods里面设置为主键
      

  2.   

    1,2我明白了 
    3,提示的信息的英文意思是对象不存在或没有权限--难道只是我把表名输错了, 也许是这样吧  以后如果在遇到这个问题我会将具体信息记录下来  然后再请教你
    4,你的意思是说 定义主键本身就是一种约束  另外如果像你说的那样 在列上有约束时  修改列属性需要禁用约束  才可以执行修改的操作  那为什么  这个是可执行的alter table Table_Test alter column Two char(3)   --two属性列上也有约束的呀--Two char(2) null check (Two in('F','M')),哦 我明白了 这个不能修改  不像你说的是因为有约束, 而是我要修改后的数值类型和后面的约束不搭配比如int ,money 就会报错 而char时就成功   我明白了 谢谢你呀   我想主码不能修改就是想你说的那样吧  只是好奇这么重要书上为什么没有写   谢谢你及时准确的回复   给我的帮助很大  完全的解决了我的问题和困惑   真心的感谢你  
    另外补充两个问题   怎样禁用约束?还有就是看你的名字   你应该对Ubuntu情有独钟而且也十分熟悉吧  我是初学   数据库方向  我想知道  像数据库管理员   对于linux的学习   应该在怎样的角度上 都有哪些方面是必须掌握的  谢谢你!!!
      

  3.   

    哦 还忘了  第五个问题  “goodid需要在表Table_Goods里面设置为主键”  问题是goodid就是表Table_Goods里的主键呀  我贴的图片上有的  只是图片不能显示   那又会是什么原因呢  请你帮我在想想
      

  4.   

    1,禁用约束的话可以参考联机丛书的ALTER TABLE,对nocheck 和drop 做了详细的描述2,问题5:
    能否贴下你的Table_Goods的表结构呢?或者也可以考虑对两列做外键约束,当然,前提是在Table_Goods里面的GoodID,SaleUnitPrice要为主键。
    FOREIGN KEY (GoodID,SaleUnitPrice) REFERENCES Table_Goods(GoodID,SaleUnitPrice)3,也是刚入门,共勉哈。
      

  5.   

    1, 联机丛书有点混乱 我刚开始学  还是看了你的建议才第一次打开联机丛书 而且才发现原来有这么多的资料呀  方方面面的  你都是参考联机丛书的吗   这个只有联网的时候可以参考  要是没有网的时候  有别的什么办法吗  另外  这个是英语的  读起来毕竟比中文要慢呀   2  为什么你会想到对两列做外键约束,为什么需要这样呢,当然是可以的,我只是想知道,你的依据是什么,确实 在两个表中都有这个属性列SaleUnitPrice  是不是因为在数据库中不同的表中的属性列不可以同名除非作为外键,我记得好像有这么个要求,我记的不太清了,忘了在书上那里写的了,哎看书看的太不认真了我, 记的糊里糊度的  失败!在思考这个问题的时候,我发现我原来没有真正的理解外键约束存在的意义   数据的一致性   如果相同的属性列 在不同的表中  如果没有外键约束的话  势必会出现不同的表中 相同的属性列的值不同的情况  从而破坏了数据的一致性    我又在想   如果在一个表中已经有了对一个对象的描述——一个属性列  那为什么在其他的表中还要重复的记录这一属性呢 这样不是冗余吗  我想似乎外键都是为了规范化而被分解出去的   你是怎样看的呢   不好意思   我刚学     基本概念有点混乱
    图我贴上总是不能正常显示   不过我还是贴在下面了 ,你要是还看不到的话, 把你的邮箱给我  我发你邮箱里另外 你太谦虚啦  ^_^
    我发现我的错误啦   还是概念没有搞清我  我在书上找到了  在概念建模时就有这样的要求 迁移主码(1在一个联系中,迁移总是从父到子或从一般到分类实体集  2主码属性才能被迁移,如果主码是由多个属性构成则全部迁移   就像你说的那样  一开始我没有明白  现在明白了   可是又有一个问题   主码的约束  最小性:不存在从主码中去掉一个属性 还能保持数值的唯一性   如果将GoodID,SaleUnitPrice做为主码  很明显如果去掉SaleUnitPrice  还能保持数值的唯一性  这也是我一开始没有将SaleUnitPrice加入主码的原因   这可怎么解决呢??(最后的一个问题)        似乎这个问题属于ER建模的  不算是SQL server的   出这样的错误也是无奈之举呀(我妄想自己建个实例,按照课本给表 然后在加些数据   练习写查询语句时就可以执行一下  而不是仅仅看看有没有编写错误)    我编写脚本只有  几张表的描述(书上的例题)  没有ER图  看来得先把ER图搞好了在建表  不过我从错误中还是学到了不少东西  对一些问题有了更深的理解  另外按照你说的修改   问题已经解决了   哈  哈  哈  哈  终于解决了  三天了   郁闷坏了  终于。记得我的最后一个问题,哦图:
      

  6.   

    问题三,好像也可以对唯一列建外键
    if OBJECT_ID('Table_Goods') is not null drop table Table_Goods
    CREATE TABLE Table_Goods
    (
    GoodID varchar(8) primary key,
    SaleUnitPrice money unique
    --constraint pk_table_goods primary key(goodid,saleunitprice)
    )if OBJECT_ID('Table_SaleBillDetail') is not null drop table Table_SaleBillDetail
    CREATE TABLE Table_SaleBillDetail

    SaleBillID VARCHAR(8) NOT NULL PRIMARY KEY ,
    GoodID VARCHAR(8) NOT NULL REFERENCES Table_Goods(GoodID) ,
    SaleUnitPrice MONEY NOT NULL  REFERENCES Table_Goods(SaleUnitPrice) ,
    Quantity INT NOT NULL ,
    Amount MONEY NOT NULL ,
    Discount INT NOT NULL CHECK (Discount IN (0,10)),
    DiscountAmount MONEY NOT NULL ,
    CHECK (DiscountAmount=Amount*(1-Discount))
    )
      

  7.   

    你是怎么做到的  那段代码  我还以为是图片  结果是文字的  而且还有框架  真的很厉害呀  
    原来实际中使用的脚本是这样的  谢谢指点!!!
    --constraint pk_table_goods primary key(goodid,saleunitprice)
    这个是注释不编译的吧  那么主键是一个属性还是两个呢还有怎样将约束写成对象的形式 就是说那个约束有名字  可以drop 或forbid
    感觉应该就像这句注释的样子吧--constraint pk_table_goods primary key(goodid,saleunitprice) Pk_table_goods 是不是就是约束的名字?
    还有 这个真的可以这样写?CHECK (Discount IN (0,10)),  你不是告诉我要这样写吗check(Discount>=0 and Discount <=10)另外你说的这个原理(unique)我理解 作为外键是要引用的  必须保证引用时的可确定性  如果有相同的就会发生故障       当时我也有想到这个  只是SaleUnitPrice money unique 这个条件在实际中是不是不太合适呀    还有别的办法吗   就是这个问题  导致我又遇到了新的问题  还是那个问题 
    Table_Goods的主键由两个属性构成(GoodsID,SaleUnitPrice) 可是要建的新表  只有其中一个属性列GoodsID  所以外键约束无法正常建立
    新表:
    create table Table_InStockBillDetail 
    (
    InStockBillID varchar(8) not null primary key,
    GoodsID varchar(8) not null references Table_Goods(GoodsID),
    BuyPrice money not null,
    Quantity int not null,
    ProviderID int not null references Table_Provider(ProviderID),
    BuyDate datetime not null
    )
    出错信息:
    消息 1770,级别 16,状态 0,第 1 行
    Foreign key 'FK__Table_InS__Goods__5DCAEF64' references invalid column 'GoodsID' in referenced table 'Table_Goods'.
    消息 1750,级别 16,状态 0,第 1 行
    Could not create constraint. See previous errors.
    所以还是一开始的那个问题:将GoodID,SaleUnitPrice做为主码  不符合主码的最小性约束 就必定会出现现在这样的问题   可是矛盾在于又必须被其他表外码引用SaleUnitPrice 而只有主码可以作为其他表的外码别引用  用UNIQUE 在输入数据时又会有问题  比如两个商品的ID肯定不同  但单价是很有可能相同 如果相同则有一个不能被录入   这个怎么解决呀   我也再想想看是哪里出了问题  或许表的属性就设置的不合适吧  咱们一起想  不好意思 我比较笨   耽误了你这么多的时间   实在。不好意思谢谢 你总是及时的回复
      

  8.   

    山寨DBA。。1,既然你说SaleUnitPrice是无法保证唯一的,那就不必要对SaleUnitPrice设置主键或者唯一约束。
    既然你要求Table_SaleBillDetail的SaleUnitPrice和Table_Goods的SaleUnitPrice设置外键约束,那完全可以考虑只对SaleUnitPrice做一次存储,即只在Table_Goods或者Table_SaleBillDetail里设置一列SaleUnitPrice值就可以了。到时,如果需要使用时,就用表连接处理。2,设置个有规范的约束名称,是一个很好的习惯。3,check是复制你的,没改过来,要在一个区间,还是使用>= 和<=,in只表示在in里面的2个值;
      

  9.   

    1,解决了  2,设置个有规范的约束名称,是一个很好的习惯。  可是  ‘--’不是代表后面是注释内容吗  注释不是不编译的吗    是怎么回事新问题insert Table_Card values ('20000003','2007/1/1','2009/12/31',0,0 )信息:(1 行受影响)
    另外最后两列的数据类型分别为 int, char(1)  正确的是不是应该插入时写成 0,'0' 还是随便我试了一下  结果都可以  为什么  ?  int  应该 0   char(1) 应该'0'的不是? 
      

  10.   


    2,--是注释,不会被解析的。这是我标注的一个东西了,因为前面的列已经定义了primary key
    3,你看下convert和cast的联机丛书就知道了。它们之间存在隐式转换。