2016-09-30 67 views
1

我正在创建一个设备管理系统,其中所有设备(如手机,PDA,计算机等)都链接到“所有者”。在SQL表中更改主键

设置tbldevice我发现我没有从所有设备上获取IMEI号码,有的只显示序列号,有的甚至没有这些。

当我将已经使用的设备插入表格中时,我没有包装,通常可以找到序列号。

但我想用序列号或IMEI作为PK来避免重复。现在我有两个字段s/n和IMEI。由于上述原因,我无法组合PK。

任何想法我应该如何设置一个合适的PK?

+8

自动生成的ID很方便。结合独特的约束。 – jarlh

+0

自动生成的ID已在使用中。 s/n加上IMEI的组合,即使其中一个有NULL值似乎可以解决我的问题。到后期阶段,用户不太可能检索缺失的值,无论是s/n还是IMEI,因为否则就不会违反唯一密钥。谢谢你回复。 Michael – mak

+0

你正在使用哪些DBMS? –

回答

0

也许添加列装满

nvl(SN,'##SN##') || nvl(IMEI,'#IMEI#') 

和一些逻辑来填补它的时候更新/插入表。如果它们是数字,也许有可能用一些未使用的数字替代丢失的数字,如

nvl(SN,9999999999) || nvl(IMEI,9999999999) 

在列上创建主键。

+0

正如他所说的,可能有手机有SN但没有IMEI,而IMEI却没有SN。如果有人再次添加了电话,但两者都同时使用,则此解决方案无法工作。 – JohnHC

+0

如果有人第二次插入相同的设备,则无法正常工作。只有ide是关于将两个唯一索引不允许插入重复项并单独处理它们,但由于性能原因,这可能是不可接受的。 – Kacper

0

如果您还没有IMEI号码和序列号无法识别手机/ PDA,那么您需要IMEI和/或序列号,并且两者都必须是唯一的。

并且可以结合使用IMEI和序列号做单个主键,并且有一个技巧:如果没有IMEI用不与现有IMEI值冲突的唯一值填充,如独特的数字或连接随机和时间戳;和序号相同的行为。

然后IMEI和序列号没有空值都不重复,你可以做你的组合主键。

+0

这不会阻止重复!第二次你想要插入同一个设备时,你只需要s/n或者IMEI,但是使用任何随机数字都不能阻止插入。 Michael – mak

+0

当然,您需要一些逻辑来验证某些IMEI和/或序列号是否已经注册(可以为IMEI和其他序列号创建唯一索引)。我只想在一个可行的解决方案中将组合信息保存为主键。你也可以在两列中都允许空值,并用组合键来创建主键;那么如果您尝试在没有序列号的情况下插入两次相同的IMEI,数据库不允许;但是如果存在一个IMEI并且尝试添加他的序列号,则需要一些逻辑来控制更新。 –