如何使JDBC MYSQL中的主键区分大小写?

时间:2014-06-20 09:07:17

标签: java sql database jdbc primary-key

我将主键定义为字符串值。所以两个元组的主键为" Hello"和"你好"因为主键不区分大小写,所以无法存在。

创建主键不区分大小写的表的sql语句是什么?

2 个答案:

答案 0 :(得分:1)

您基本上需要使用子查询的检查约束。但由于在检查约束中不允许子查询,因此您可以编写一个运行查询并返回a的函数 结果:(假设您的PK被称为ID)

create or replace
FUNCTION check_id(ID_INPUT IN VARCHAR2) 
   RETURN NUMBER
   IS count_id NUMBER;
Begin 
   SELECT count(*) INTO count_id FROM table WHERE UPPER(ID_INPUT) = UPPER(ID); 
   Return(Count_Id); 
END;

然后在主键的检查约束中使用此功能

CHECK check_id(ID) = 0

试试这个并告诉我。尚未验证它的语法。

答案 1 :(得分:0)

具有由约束调用的用户定义函数是一种方法。缺点是每次插入行时都必须执行完整的表扫描 - 或者每当更新关键字段时都要执行,但是这不应该经常发生。此外,开发一个可以通过约束引用的udf并不总是那么容易。即使它被允许,该功能也必须满足关于确定性而不改变数据状态的严格要求。一些DBMS使这相对容易,其他DBMS则不这样做。

另一种选择是定义一个"阴影"领域。由插入和更新触发器填充的该字段将是转换为所有一种情况(上部或下部)的ID字段的内容。然后,阴影区域的唯一约束将满足您的需要。这也可以作为计算列实现,它们存在,但触发器会更好。如果是重复,则触发器可以截取异常并使用ID字段而不是名为罪魁祸首的影子来自行拦截。

此方法的缺点是您将包含密钥数据所需的空间增加了一倍。这可能是也可能不重要。

有趣的是,Oracle 12c引入了"隐形"柱。它的行为与任何其他列一样,除非必须明确引用,例如,它不会显示在select *中。这对于这样一个不可见的列来说是完美的用途。