DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wjy13061029975
今日帖子: 2
在线用户: 2
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 jxwit (fox) ★☆☆☆☆ -
普通会员
2016/11/2 20:45:09
标题:
如何用SQL语句插入数据前判断是否存在某字段数据重复? 浏览:1714
加入我的收藏
楼主: 假设有一张表A,分别有F1,F2,F3三个字段(都未设定主键)

求SQL语句插入A表前先判断F1字段是否有相同。有则忽略,没有就插入。

谢谢
----------------------------------------------
-
作者:
男 ghs_79 (ghs) ★☆☆☆☆ -
盒子活跃会员
2016/11/3 8:07:13
1楼: 插入前先查询,就这么简单。
----------------------------------------------
Delphi爱好者。
作者:
男 brh616 (风风风) ★☆☆☆☆ -
盒子活跃会员
2016/11/3 9:09:31
2楼: if not exists (select * from a where f1 = '')
insert into a ...
----------------------------------------------
风风风
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/11/3 9:27:22
2楼: 打死楼主也不查询,否则这个破问题,不会问好几遍了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 jljaaj (小强) ▲▲▲△△ -
普通会员
2016/11/3 10:22:59
3楼: Function if_chongfu(BH_FieldName, tableName, New_z: string): Boolean; //
// ----------   函数说明   ----------//
// ----- 函数作用: 检验数据库字段记录是否重复    ----//
// ----- 参数说明: BH_FieldName(表字段名),TableName(表名),   New_z(新数据)        ----//
// -----          ----//
// ----- 返回值:  布尔   false=不重复;  true=重复          ----//

// ----------//
var
  adoQ_temp: TFDQuery;
begin
  adoQ_temp := TFDQuery.Create(nil); // 生成临时的ADOQuery变量
  adoQ_temp.Connection := FDConnection1;   // 将adoQ_temp与ADOConnection1相连
  try
    with adoQ_temp do
    begin
      Close;
      SQL.Clear;
      SQL.Add(format('select %s from %s where ' + Trim(BH_FieldName) +
        ' = "%s" ', [BH_FieldName, tableName, New_z]));
      Open;
      if adoQ_temp.RecordCount <> 0 then
      begin
        Result := True;
        Exit;
      end;
      Close;
    end;
    Result := False;
  finally
    adoQ_temp.free;
  end;

end;
----------------------------------------------
-
作者:
男 beibeili (beibeili) ★☆☆☆☆ -
普通会员
2016/11/3 10:40:30
4楼: 楼上的同学们不要那么做了!使用select判断是否有数据再插入的方法是有问题的!
因为数据库是并行操作的,例如
A进程正常插入一条记录,但没有提交,这时候B进程进行Select是查不到的,这样就可能造成数据的重复提交。在大量有并行操作的系统,尤其是与资金相关必定会出现大量的问题!
解决的方法有两种:
1、使用数据库提供的唯一性约束检查,但这样做多导致数据库报异常,因此程序要处理好。
2、现在的数据库使用的都是行级锁,所以可以使用Update语句试探性的进行更新,如果能更新到数据,则说明存在,否则既可以插入。这种情况下即使有另一个进程同时插入的话也不会有问题,这要求对应的表中需要有一个可被更新的无效数据字段的存在。
PS:如果数据库使用的是Oracle的话,可以使用Merge语句进行操作。
----------------------------------------------
-
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2016/11/3 11:20:57
5楼: 同意2、4楼。
按楼主思路就是2楼。
但是4楼说的很对,除非是用户的系统,否则逻辑上都不对。
----------------------------------------------
-
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2016/11/3 14:28:48
6楼: 更正:
除非是单用户的系统

少了一个“单”字
----------------------------------------------
-
作者:
男 yuzhenguo0 (金远见) ▲▲▲▲▲ -
普通会员
2016/11/3 14:31:10
7楼: 呵呵 并行 这个问题挺难搞定
----------------------------------------------
学DELPHI http://www.studydelphi.com
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2016/11/3 14:40:15
8楼: 触发器可以搞定的楼主需求,但是会带来效率问题
----------------------------------------------
-
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2016/11/4 9:15:17
9楼: https://zhidao.baidu.com/question/576304982.html

给一个网上找的例子(本人未验证,仅供参考),来源是上面

SQL server2008数据库, A 表的登记号是主键, 在A表执行删除操作时,同时向B表插入一条相同的记录,
如果B表存在登记号相同的记录时,则先删除B表的该记录再执行输入插入,
这个触发器怎么写?


create trigger a_tri_ins
on A
as
begin
   declare @c登记号 varchar(100)
   select @c登记号 = 登记号 from inserted
   if exists ( select 1 from B where  登记号 = @c登记号 )
      delete B where  登记号 = @c登记号
  
   insert B ( 列名全写出来 )
   select 列名全写出来 from inserted
end
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行76.17188毫秒 RSS