解决java嵌入式SQL数据库中的独占关系

时间:2014-11-12 09:30:30

标签: java sql derby hsqldb

我正在尝试构建一个需要在SQL数据库中存储数据的java程序,该数据库需要嵌入到我的应用程序中,这样我就可以将应用程序运行到任何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上的行是否已与其他三个表有关系,如果为true,则中止插入,如下所示:

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”命令,并且在不更改分隔符的情况下,因为遇到分号而无法保存触发器,所以进程停止。

我可以使用哪个DB来解决这个问题,或者我如何使用Derby或HSQL?我的程序将用Java编写,数据库应控制几乎所有情况。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

经过大量研究,我确定需要使用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