创建检查 ID 是不是唯一的函数
Posted
技术标签:
【中文标题】创建检查 ID 是不是唯一的函数【英文标题】:Create function that checks if ID is unique创建检查 ID 是否唯一的函数 【发布时间】:2014-12-18 14:06:19 【问题描述】:我想创建一个函数来检查我将插入的 ID 是否唯一。 这就是我所做的:
-- the function has to return true if ID is unique and false if ID is allready used(not unique)
CREATE OR REPLACE FUNCTION Check_uniqueID
( p_ID IN STORE."ID"%TYPE)
RETURN BOOLEAN
AS
v_IsUnique BOOLEAN := FALSE;
BEGIN
ALTER TABLE STORE
ADD CONSTRAINT check_unique_id UNIQUE (p_ID);
-- how can i programm that he returns true if its unique and false if its not?
v_IsUnique := TRUE;
RETURN v_IsUnique;
END;
提前致谢!
【问题讨论】:
这就是我现在所拥有的 CREATE OR REPLACE FUNCTION Check_uniqueID ( p_ID IN STORE."ID"%TYPE) RETURN BOOLEAN AS v_ID STORE."ID"%TYPE; v_IsUnique BOOLEAN := FALSE; BEGIN SELECT "ID" INTO v_ID FROM STORE WHERE "ID"=p_ID;如果 v_ID = NULL 那么 v_IsUnique := true; ELSE v_IsUnique := FALSE;万一;返回 v_IsUnique;结束; 为什么?您应该有一个具有自动生成值的唯一索引,强制它是唯一的。 【参考方案1】:这里唯一的好习惯是使用唯一的约束和顺序。添加约束(你需要做一次):
ALTER TABLE STORE ADD CONSTRAINT check_unique_id UNIQUE (p_ID);
为 ID 创建序列(一次):
create sequence my_sequence;
在INSERT
语句中使用它:
insert into STORE (id, another_field)
values (my_sequence.nextval, 'some value for another field');
或:
insert into STORE (id, another_field)
select my_sequence.nextval, one_more_field
from some_table;
如果不想使用序列,则需要处理异常ORA-00001
。
【讨论】:
【参考方案2】:在函数中使用ALTER TABLE
只是为了检查是否违反了约束是非常糟糕的做法。您应该永久拥有对表的约束,并在抛出 ORA-00001: unique constraint (constraint_name) violated
异常时处理它。您似乎也误解了ALTER TABLE
的语法,因为您试图在STORE.p_ID
的不存在列上添加约束。
但是,如果您必须使用函数来重现数据库通过检查约束提供的功能(用于 UI 中的预验证或类似内容),则可以这样做:
CREATE OR REPLACE FUNCTION check_uniqueid (p_id IN NUMBER)
RETURN BOOLEAN
AS
li_count PLS_INTEGER;
BEGIN
SELECT COUNT(1)
INTO li_count
FROM store s
WHERE s.id = p_id;
RETURN li_count = 0;
END;
【讨论】:
但是如果同时使用这仍然会很糟糕并且容易出错。如果两个进程插入相同的 ID,该函数将给两者一个 OK,因为它们只在 COMMIT 之后看到它们的更改。这就是为什么约束是唯一正确的方法! 同意,最终这听起来像是一个设计缺陷,表格上名为“id”的列可能应该通过序列填充。【参考方案3】:您可以使用 SELECT 查询来检查值是否已存储在表中。
【讨论】:
以上是关于创建检查 ID 是不是唯一的函数的主要内容,如果未能解决你的问题,请参考以下文章
当所有检索值在laravel中具有相同的会话键时,如何检查会话数组是不是具有唯一的ID