| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5022 人关注过本帖, 1 人收藏
标题:唯一索引设置问题
只看楼主 加入收藏
shzhshg
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2010-5-7
结帖率:85.71%
收藏(1)
已结贴  问题点数:5 回复次数:10 
唯一索引设置问题
表1.dbf
编号  姓名  身份证号码     住址
1   王丽  370128199806022802 北京东城区
2   崔强  370128199912060708 日照岚山区

我想在每添加一条记录时,当输入身份证号码时,若以前输入保存过此号码,则自动显示不能重复输入此号码的提示。
搜索更多相关主题的帖子: 身份证号码 北京东城区 岚山区 记录 日照 
2016-03-07 05:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10567
专家分:43011
注 册:2014-5-20
收藏
得分:0 
查找 表1 的 身份证号码
2016-03-07 07:42
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11798
专家分:43421
注 册:2006-5-13
收藏
得分:1 
这用不着使用唯一索引,接收用户输入的身份证号之后立即到表中搜索,不存在相同的身份证号才能继续输入其他信息。
当然用唯一索引也可以,但系统会出现错误提示,处理起来比较麻烦,不如自己用代码搜索更灵活方便。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-03-07 07:48
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:653
专家分:2160
注 册:2014-2-7
收藏
得分:1 
首先需要指出的是:要建立的是“主索引”或“候选索引”,不是“唯一索引”。

使用下列命令可为表建立基于“身份证号”的主索引:
alter table 表1 add primary key 身份证号 for !delete() tag 身份证号

若在 Browse 窗口中输入,若身份证号重复,系统会弹击提示窗口,单击“Revert(还原)”则取消修改。

若在程序中添加记录,可捕获错误 1884,参考如下代码:

TRY
    INSERT INTO 表1 (姓名,身份证号,住址) VALUES (cName,cIdNo,cAddress)
CATCH TO oErr WHEN oErr.ErrorNo = 1884
    MESSAGEBOX('所输入的身份证号已经存在!',48,'提示')
ENDTRY

泉城飞狐
2016-03-07 08:33
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:1 
结合3、4楼的说法哦:你可以选择建候选索引或主索引(只能用于包含在数据库里的表文件),但要自己额外再加错误捕捉代码,如果对此不熟悉的,也比较麻烦。我个人比较倾向3楼的做法,不用VFP的唯一值索引规则,而是自己写代码。通常我会这么做:在录入身份证号码文本框的Valid事件中添加一段代码来查找是否已经存在这个身份证号。当然,为了查找速度快,你可以事先为身份证号码字段建立一个索引(但普通索引即可),并保持它有效。当查找到有重复号码时,用Messagebox()函数作出提醒,然后以RETURN 0作为返回,焦点会继续留在该文本框里等待合法的录入;若在表文件中找不到当前的身份证号,用RETURN 1返回,焦点可自动进入下一个控件。
2016-03-07 09:06
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:653
专家分:2160
注 册:2014-2-7
收藏
得分:1 
必须指出的是:在添加记录前,通过用代码去搜索身份证号是否存在的做法仅适用于单用户环境,对于多用户环境来说,并不能百分之百保证身份证号不重复。

试想:A用户和B用户同时添加记录的情况,两用户输入同一身份证号时,身份证号重复的两条记录有可能同时被添加至表,尽管发生这种情况的机率很小。在我开发的应用中,也确实遇到过这种情况。因此,使用主索引或候选索引才是正解。

泉城飞狐
2016-03-07 10:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10567
专家分:43011
注 册:2014-5-20
收藏
得分:0 
多用户情况能用好VFP的“锁”就没问题。
2016-03-07 11:01
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
我有一个疑问:多用户网络情况下,同时输入同一个身份证号码,即便是建立了唯一值的索引系统,是不是也可能会出现同时存入的情况?
2016-03-07 12:34
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:653
专家分:2160
注 册:2014-2-7
收藏
得分:0 
1. 建立了主索引或候选索引时,不可能出现重复关键字记录的。在将数据写入表时,VFP 从底层来防止重复值的写入。
2. 我不太理解如何用“锁”来预防重复记录。对于“记录锁”或“表锁”来说,“锁定”记录是防止其他用户对已锁定记录的“修改”,并不能阻止其他用户“读取”记录。除非以“独占”方式打开表。而“独占”方式打开表,又相当于“单用户”环境了。

泉城飞狐
2016-03-07 13:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10567
专家分:43011
注 册:2014-5-20
收藏
得分:1 
以下是引用liuxingang28在2016-3-7 13:27:01的发言:
2. 我不太理解如何用“锁”来预防重复记录。对于“记录锁”或“表锁”来说,“锁定”记录是防止其他用户对已锁定记录的“修改”,并不能阻止其他用户“读取”记录。除非以“独占”方式打开表。而“独占”方式打开表,又相当于“单用户”环境了。

要有一个机制:任何用户同做这一事务时,先获取锁表权,如果获取成功再读写数据记录,如果获取不成功就等待、重试或退出。
问题是如何防止出现“死锁”,这是VFP多用户编程的关键,这不只是重复记录的问题。
2016-03-07 14:13
快速回复:唯一索引设置问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013475 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved