Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java嵌入式SQL数据库中解决排他关系_Java_Sql_Derby_Hsqldb - Fatal编程技术网

在java嵌入式SQL数据库中解决排他关系

在java嵌入式SQL数据库中解决排他关系,java,sql,derby,hsqldb,Java,Sql,Derby,Hsqldb,我正在尝试构建一个java程序,该程序需要将数据存储在一个SQL数据库中,该数据库需要嵌入到我的应用程序中,这样我就可以在任何PC上运行该应用程序,并且数据仍然存在 那么,我的范例如下 主表与四个表有四个关系。它们每侧都是(0:N),因此示例如下: MAIN_TABLE (0:n) ------ (0:n) TABLE_1 表_2、表_3和表_4的情况相同,给出了一个示例 在这里一切正常之前,当“Main_Table”只能与“Table_1”或“Table_2”或“Table_3”或“Tabl

我正在尝试构建一个java程序,该程序需要将数据存储在一个SQL数据库中,该数据库需要嵌入到我的应用程序中,这样我就可以在任何PC上运行该应用程序,并且数据仍然存在

那么,我的范例如下

主表与四个表有四个关系。它们每侧都是(0:N),因此示例如下:

MAIN_TABLE (0:n) ------ (0:n) TABLE_1
表_2、表_3和表_4的情况相同,给出了一个示例

在这里一切正常之前,当“Main_Table”只能与“Table_1”或“Table_2”或“Table_3”或“Table_4”有一个关系时,问题就出现了。他们不可能是其中的两个或两个以上。为了解决N:M关系,引入了表“alpha”、“beta”、“gamma”和“lambda”,其中一个表处理每个表与主表的关系

有人告诉我使用触发器来检查MAIN_表上的一行是否已经与其他三个表有关系,如果为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”命令,如果不更改分隔符,就无法保存触发器,因为它遇到分号,进程就会停止

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


提前感谢。

经过大量研究,我决定使用HSQLDB,主要原因有两个: Derby只允许触发器只有一个sql查询。第二个原因是避免创建触发器序列,因为Derby也不允许任何declare子句。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