SQL表用代码设置默认值,奇了怪!

yjrryyx 2010-01-07 12:40:46
第一次用代码自动设置SQL表默认值,全部有效,将表名不同但字段相同的同一数据库下的另一表再运行代码,全部无效,如将另一表改动几个不同的字段名称,改动的有效。就是已经设置过默认值的,不管是另一个表只要字段名称相同就无法自动设置默认值,这SQL是到底是这么规定的,那儿出了问题,有请高手帮忙,谢谢!

自动设置默认值代码如下:

SQLEXEC(nhandle,"select * from ckckzz","tmp1")
SELECT tmp1
COPY STRUCTURE EXTENDED TO FileName
USE FileName
SCAN
kk=ALLTRIM(field_name)
DO case
CASE field_type="C"
SQLEXEC(nhandle,"alter table ckckzz add CONSTRAINT &kk default space(2) for &kk") &&字符型默认为二个空格
CASE field_type="N" OR field_type="L"
SQLEXEC(nhandle,"alter table ckckzz add CONSTRAINT &kk default 0 for &kk") &&数值型或逻辑型默认为0
ENDCASE
ENDSCAN
...全文
1000 31 打赏 收藏 举报
写回复
31 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yjrryyx 2010-01-12
  • 打赏
  • 举报
回复
谢豆三大侠,你的代码我重新又运行了一次,可以对不同的表同名字段全部设置成功!
看来确实在SQL内部作了处理,在VFP中我们是把表作为一个总体来处理的,而SQL是把一个数据库作为一个总体来处理的,如此才可以理解:约束名在数据库内必须是唯一的这句话的道理!
谢各位:
豆三大侠 谢:30分
猫大侠 谢:30分
狼大侠 谢:20分
双胞胎b 谢:20分



十豆三 2010-01-12
  • 打赏
  • 举报
回复
我26楼的代码是可以重复运行,并且能够设置成功的。我测试通过的。
都市夜猫 2010-01-12
  • 打赏
  • 举报
回复
如果你会使用 sql server 的事件探测器的话,你可以看到你手工设置时 sql server 自动生成的语句是如何处理的;通常它会先判断指定名称的约束是否存在,存在的话会先删除它
都市夜猫 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 yjrryyx 的回复:]
同一数据库内部不允许同名约束,在帮助中找不到理论支持
[/Quote]

下面是摘自 tsql 帮助文件中的内容:

...
CONSTRAINT
是可选关键字,表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 约束定义的开始。约束是特殊属性,用于强制数据完整性并可以为表及其列创建索引。

constrain_name
是约束的名称。约束名在数据库内必须是唯一的。


NULL | NOT NULL
是确定列中是否允许空值的关键字。从严格意义上讲,NULL 不是约束,但可以使用与指定 NOT NULL 同样的方法指定。

...
yjrryyx 2010-01-12
  • 打赏
  • 举报
回复
谢豆三大侠!
你的程序可以运行,但对表的默认设置均无效
我确认手工可以建立,而且建立后可以运行

手工建立,数据库在内部作了处理,找不到出入点
同一数据库内部不允许同名约束,在帮助中找不到理论支持
疑惑啊...

在本论坛第一次被问题拌住了!
十豆三 2010-01-12
  • 打赏
  • 举报
回复
请参考:

Set Talk Off
Set Safe Off
Public nhandle
nhandle=Sqlstringconnect("driver=sql server;server=yjr;uid=sa;pwd=12;database=msgl")
If nhandle<=0
Messagebox("连接失败")
Return
Endif
SQLExec(nhandle,"select * from ckckzz","tmp1")
Select tmp1
Copy Structure Extended To FileName
Use FileName
*Brow
lcTableName='ckckzz1' &&第一个表名,此处改为你的实际表名
Scan
kk1=lcTableName+"_"+Alltrim(field_name)
kk2=Alltrim(field_name)
Do Case
Case field_type="C"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default ' ' for &kk2.") &&字符型默认为二个空格
Case field_type="N" Or field_type="L"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default 0 for &kk2.") &&数值型或逻辑型默认为0
Endcase
Endscan
lcTableName='ckckzz2' &&第二个表名,此处改为你的实际表名,与第一个表名字段一样
Scan
kk1=lcTableName+"_"+Alltrim(field_name)
kk2=Alltrim(field_name)
Do Case
Case field_type="C"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default ' ' for &kk2.") &&字符型默认为二个空格
Case field_type="N" Or field_type="L"
SQLExec(nhandle,"alter table &lcTableName. drop CONSTRAINT &kk1.") &&删除,防止多次运行
SQLExec(nhandle,"alter table &lcTableName. add CONSTRAINT &kk1. default 0 for &kk2.") &&数值型或逻辑型默认为0
Endcase
Endscan
十豆三 2010-01-11
  • 打赏
  • 举报
回复
手动可以是因为系统自动建立不重名的约束的原因。

1、

kk=Alltrim(field_name)
改为
kk=你的表名+Alltrim(field_name)
如:
kk=ALIAS()+Alltrim(field_name)

2、
每次执行这段代码前都要删除原来约束,然后再执行。

另外:你这段代码的目的是代码建立数据库吗?
如果是有更好的办法,就是将你的数据库生成脚本,然后需要建立时在查询分析器中手动执行,或用代码执行(参数 SQL Server 的 osql.exe)

如果是程序中用到的,那可以在 SQL Server 中通过存付诸过程或自定义函数来完成,都可以。
十豆三 2010-01-11
  • 打赏
  • 举报
回复
应该是不允许同名约束的。

你确认手工可以建立?即使建立了也都好用?
yjrryyx 2010-01-11
  • 打赏
  • 举报
回复
豆三大侠帮我测试一下:一个数据库中的二个表不能同名约束!
我的数据库:msgl
数据库下面有二个表:1.msbbzz 2.ckmszz
第二个表是第一个表复制后多加了几个不同字段
我用代码设置默认值,第一个表全部设置成功
我再用代码设置第二个表,代码中的表名也换成第二个表的表名,但第二个表跟第一个表相同字段设置无效,不相同的字段设置成功。

狼大侠和猫大侠的理由是一个数据库中不能有同名约束,即使是二个不同的表名有相同的字段,(当然一个表是不可能有同名字段的,更别说是同名约束了)

问题是我在数据库中直接修改是可以的,这说明一个数据库中不同的表是可以有同名约束的,否决了上述理由!
但我用代码就不可以呢?即使加上不同的表名也不行!
请帮我看一下,代码中哪儿出了问题,谢谢!

wwwwb 2010-01-07
  • 打赏
  • 举报
回复
下班了,明日再看看
就是两个DBF?
没有ckckzz?
yjrryyx 2010-01-07
  • 打赏
  • 举报
回复
狼狼、猫猫,双胞胎,谢谢!
已上传:新建文件夹 .rar
有记录的
wwwwb 2010-01-07
  • 打赏
  • 举报
回复
你的表是SQLSERVER,没有记录,你可以转到DBF,我在DBC中测试一下,重新上传,只要你用到的表,
记录10条左右即可,主要是测试代码
yjrryyx 2010-01-07
  • 打赏
  • 举报
回复
已上传,谢谢啦!
二个表都要导入SQL后再设置默认值!
wwwwb 2010-01-07
  • 打赏
  • 举报
回复
你上传到ACCESS911.NET/CSDN
yjrryyx 2010-01-07
  • 打赏
  • 举报
回复

不能发图?
ACMAIN_CHM 2010-01-07
  • 打赏
  • 举报
回复
表AAA时 CCC字段时
alter table AAA add CONSTRAINT AAACCC default space(2) for CCC

表BBB时 CCC字段时
alter table BBB add CONSTRAINT BBBCCC default space(2) for CCC
yjrryyx 2010-01-07
  • 打赏
  • 举报
回复
" alt="" />
" alt="" />
ACMAIN_CHM 2010-01-07
  • 打赏
  • 举报
回复
SQLEXEC(nhandle,"alter table ckckzz add CONSTRAINT ckczz.&kk default space(2) for ckckzz.&kk")

你这样两次执行的时候,不还都是 ckczz.&kk 吗?!

SQLEXEC(nhandle,"alter table ckckzz add CONSTRAINT ckckzz&kk default space(2) for &kk")

每次运行的时候,把红色部分换个不同的。
wwwwb 2010-01-07
  • 打赏
  • 举报
回复
kk中的内容是什么?
yjrryyx 2010-01-07
  • 打赏
  • 举报
回复
加载更多回复(11)
相关推荐
发帖
VFP

2574

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2010-01-07 12:40
社区公告
暂无公告