我正在尝试构建一个 java 程序,该程序需要将数据存储在 SQL 数据库中,该数据库需要嵌入到我的应用程序中,以便我可以在任何 PC 上运行该应用程序并且数据会保留。
那么,我的范例如下。
MAIN TABLE 与四个表有四种关系。它们的每一边都是 (0:N),所以一个例子是:
MAIN_TABLE (0:n) ------ (0:n) TABLE_1
对于 TABLE_2、TABLE_3 和 TABLE_4 来说也是如此,举个例子。
直到这里一切正常,当“Main_Table”只能与“table_1”或“table_2”或“table_3”或“table_4”有一个关系时,问题就出现了。他们永远不可能是其中的两个或多个。为了解决 N:M 关系,引入了表“alpha”、“beta”、“gamma”和“lambda”,它们处理每个 TABLE_X 与 MAIN_TABLE 的关系。
有人告诉我使用触发器来检查 MAIN_TABLE 上的一行是否已经与其他三个表有关系,如果是,则中止插入,如下所示:
DELIMITER $$
CREATE TRIGGER checker1
BEFORE INSERT ON alpha
FOR EACH ROW
BEGIN
DECLARE count INTEGER;
SELECT count(MAINTABLEid) INTO count FROM beta WHERE beta.MAINTABLEid= NEW.MAINTABLEid;
IF count > 0 THEN SIGNAL SQLSTATE '45000' SET message_text = 'THE ROW IS ALREADY CONNECTED TO ANOTHER TABLE.';
END IF;
SELECT count(MAINTABLEid) INTO count FROM gamma WHERE gamma.MAINTABLEid= NEW.MAINTABLEid;
IF count > 0 THEN SIGNAL SQLSTATE '45000' SET message_text = 'THE ROW IS ALREADY CONNECTED TO ANOTHER TABLE.';
END IF;
SELECT count(MAINTABLEid) INTO count FROM lambda WHERE lamba.MAINTABLEid= NEW.MAINTABLEid;
IF count > 0 THEN SIGNAL SQLSTATE '45000' SET message_text = 'THE ROW IS ALREADY CONNECTED TO ANOTHER TABLE.';
END IF;
END;$$
DELIMITER ;
我尝试使用 Derby 和 HSQL,但它们都不支持“DELIMITER”命令,并且如果不更改分隔符,就无法保存触发器,因为它遇到分号时进程会停止。
我可以使用哪个数据库来解决这个问题,或者如何使用 Derby 或 HSQL 来解决这个问题?我的程序将用 Java 编写,数据库应该控制几乎所有情况。
提前谢谢您。
最佳答案
经过大量研究,我确定需要使用 HSQLDB 有两个主要原因: Derby 只允许触发器只有一个 sql 查询。第二个原因是避免创建触发器序列,因为 Derby 也不允许任何声明子句。 HSQLDB允许这一切,顺便说一下,HSQLDB上的触发语句是这样的:
create trigger triggerName before insert on alpha
referencing new row as nuovo
for each row
begin atomic
declare varCount int;
set varCount=(select count(beta.MAINTABLEid) from beta where beta.MAINTABLEid=nuovo.MAINTABLEid);
if varCount>0 then signal sqlstate '45000' set message_text='The row is already referenced.';
end if;
--repeat SET and IF lines to check gamma and lambda tables
end
关于java - 解决java嵌入式SQL数据库中的排他关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883457/