还是sql语句的写法(1)。(50分)

  • 主题发起人 主题发起人 陈晨
  • 开始时间 开始时间

陈晨

Unregistered / Unconfirmed
GUEST, unregistred user!
首先解释加一的目的是以后还会有问题打搅大家的,
给出数据库结构建议和sql语句都可以
表结构 key1, key2
两个关键字,在纪录中不能有重复,
及每一个关键字都不可以出现两次
key1 的值为‘1’纪录中不能再有其他纪录的key1的值为1
key2 的值为‘2’纪录中不能再有其他纪录的key1的值为2
等待
 
没说明白,我从这个表中取得一条纪录
key1:=a;
key2:=b;
编辑这条纪录
key1:=a;
key2:=c;
我该如何判断表中没有其他的纪录
与这两个关键字重复,
我当前编辑的纪录如何才能不会影响到我检索
 
听你的意思是其实这两个关键字随便哪个都不能重复,是吧,你用内存表(ClientDataSet控件)的方法试试。
内存
//初始化它
with ClientDataSet1 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 50;
Name := 'key1';
end;
CreateDataSet;
end;
//将记录加入内存表
with ClientDataSet1 do
begin
//清空内存表
EmptyDataSet;
for i := 0 to RecordCount - 1 do
begin
Append;
FieldByName('key1').AsString := '从你表中查出的值key1';
post;
end;
end;

同理插入key2的值,这样你在编辑key1,key2值保存前,可以去到内存表中去查找是否有重复的值,
判断修改合法与否!
 
有没有这样的sql或者存储过程呢?
 
感觉上应该还是数据保存时的问题。
编写一个存储过程,在保存数据时,将数据作为存储过程的参数传入,将结果返回至应用
程序,得到保存数据的结果。
下面是比较懒的存储过程的设计思路:(oracle)
input var vkey1,vkey2,
output var result integer;
temp var vtemp,
procedure body:
result := 0;
begin
select key1 into vtemp from tabname where key1=vkey1;
result := -1;
except when no_data_found then
begin
select key2 into vtemp from tabname where key2=vkey2;
result := -2;
except when no_data_found then
begin
insert into tabname values(...);
commit;
result := 0;
except when others then
rollback;
result := -9;
end;
end;
end;

description:
result:
0 : 插入成功。
-1 : key1值重复。
-2 : key2值重复。
-9 : 关键值不重复,但插入失败。
 
这种判断方法不适合,我为了编辑这个表里面的数据而且不打算数据有重复
 
formshow :
把那两个先付到临时变量, 下面是code
code:=edit1.text
存盘时判断
adoset:=tadoquery.create(self);
adoset.connection:=dataaccess_f.Adcon;
try
try
with adoset do
begin
close;
sql.Clear;
sql.add('select count(*) from ten where code=:code');
// Parameters.ParamByName('name').Value:=trim(edtname.Text);
parameters.ParamByName('code').Value:=trim(edtcode.Text);
open;
ncount:=Fields[0].AsInteger;
end;
except
modalresult:=mrnone;
exit;
end;
finally
freeandnil(adoset);
end;
if (ncount>0)and(trim(edtcode.Text)<>code) then
begin
if application.MessageBox('&amp;raquo;·&amp;frac34;&amp;sup3;&amp;acute;ú&amp;Acirc;&amp;euml;&amp;Ouml;&amp;Oslash;&amp;cedil;&amp;acute;,&amp;Ccedil;&amp;euml;&amp;ETH;&amp;THORN;&amp;cedil;&amp;Auml;&amp;pound;&amp;iexcl;', 'FMECA',mb_ok + MB_ICONWARNING)= idok then
begin
modalresult:=mrnone;
exit;
end;
end else
begin
savedata;
modalresult:=mrok;
end;
 
好象是个主键重复的问题。
若逐渐重复,在Post的时候会提示错误的,并且 post失败,你只要根据错误提示,相应
操作就行了。
 
既然是关键字段.我建议你在数据库上做文章,
利用数据库的强大功能.来保证数据库关键字段的
的唯一性,而不是有应用程序来保证.例如, key1,
key2加上唯一性约束等.这样可以从根本上解决问题
 
同意楼上.
给KEY1加主键约束.
给KEY2加一个唯一约束.
OK.
写SQL不是太累?????
 
就是,这个问题还需要用程序来完成吗,数据库的老本行啊...
比如Oracle,加个唯一索引就可以了,建表的时候
CONSTRAINT "ai_u_1" UNIQUE("TAG_NUMBER")
索引名称 字段名称
 
使用内存表,或者临时表都会占用比较多的内存,表比较大的时候呢?
而对于建立主索引,数据库会有一个对话框,但是用户需要的是不能插入数据库是由那
个字段的数据造成的,这又怎么判断呢?
 
我有一个比较 “不怎么样” 的方法,
即: 先按照修改后的条件查询,看有没有这样的记录,如果有,
报错,用 try 屏蔽错误,这时也知道报错的原因,如果没有,
则插入,有点罗嗦,但应该可决问题
 
等我看了sql语句的表内连接分分数
 
后退
顶部