我创建了带有列(id为主键和名称)的表T1和带有列的T2(id作为主键,name,t_id作为外键引用T1(id))。我从Windows表单的输入中插入了一些值。查询SELECT * FROM T2后;使用isql,外键列中的所有值都为null,而不是由于创建的关系在T1(id)中复制值。它们是我遗漏或需要添加的东西吗?两个表的主键都是自动增量的。
答案 0 :(得分:0)
您会混淆自动增加的密钥和关系使用。
当您在密钥表上插入新记录时,自动递增的密钥(或通常是通话,字段)可以帮助您。但是当您插入一个新记录来引用另一个表中的记录时,您必须使用外键字段指定该记录。或者在您的情况下,插入"名称"的用户在T2必须说明T1上的哪一条记录" name"在T2正在参考。
您对这种关系的困惑在于您认为已建立的关系会自动强制执行该值的使用。但这种关系只会强制执行值的验证。因此,T2中的字段t_id将不会自动使用T1的最后一条记录的值。但是,如果您尝试在字段t_id中插入T1中不存在的值,则该关系将不允许您这样做。
那么,回答你的问题,你遗漏了什么并需要添加? 您省略了在T2表的t_id字段上插入值的代码部分。
让我试着用一个更常见的例子来解释。
最常见的情况是应用程序首先插入T1记录,然后当用户插入T2时,应用程序为用户提供了一种方法来选择他的T2记录引用哪一个T1记录。
假设T1是publishers表,T2是book表。用户插入发布者,在插入图书时,可以选择哪个发布者发布该图书。
答案 1 :(得分:0)
Field" ID"默认情况下,客户将使用表CUSTOMERS上的Event BeforeInsert创建表中的AUTOINCREMENT。看看
为名字表创建TRIGGER nametrigger 在插入位置之前激活0 如 开始 如果(NEW.ID为空)那么开始 NEW.ID = GEN_ID(GEN_PK_ID,1); END
END
现在客户中有一条新记录
插入客户(客户名称,联系人姓名,地址,城市,邮政编码,国家/地区) 价值观(' Cardinal',' Tom B. Erichsen',' Skagen 21',' Stavanger'' 4006' '挪威&#39);
然后ID将自动生成一个顺序号,从1到最后一个整数或smallint或bigint,如您在create table中定义的那样(因为TRIGGER
,所以注意ID字段不包含在FIELDS和VALUES中)现在您可以使用数据集(obj)选项链接表MATER和DETAIL请参阅帮助delphi
或在SQL中,您可以使用PARAMS FIELDS
稍后在表MASTER中插入一条新记录试试...
INSERT INTO xTable2(IDcustomersField,...,...,....,....) VALUES(:IDcustomersField,...,...,....,....);
xTable2也可以使用一个字段ID(主键)自动增量。这个在表中删除或更新文件时的帮助
然后您可以将值表示为:IDcustomersField在表格详细信息中使用 xQuery.PARAM(0).value或xQuery.PARAMBYNAME(IDcustomersField).value(这里我使用Query obj作为示例)
您可以在代码中使用DATASOURCE示例来说明IDcustomersField的值
可以使用 SQL中的事件
可以使用 SQL中的程序
不要忘记
你必须创建两个表之间的关系(在表格中的REFERENCIAL INTEGRITY和PRIMARY KEY)对于表格上的两个字段而言是非空的
我相信我理解我糟糕的解释(我不会说英语
答案 2 :(得分:0)
从主表T1中获取ID值后,需要手动插入t_id的值。 根据数据库中的逻辑,您还可以使用触发器或存储过程。在插入后,为我们提供有关您希望在T2中的NAME字段中具有哪些值的更多信息?它们是从T1重复还是独立于T1? 如果T1.NAME = T2.NAME,您可以使用触发器
自动执行该过程CREATE OR ALTER TRIGGER TR_T1_AI0 FOR T1
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
INSERT INTO T2(NAME, T_ID)
VALUES (NEW.NAME, NEW.ID);
END
如果T2.NAME的值与T1.NAME不同,您可以使用带有两个名称参数的存储过程:
CREATE ORA ALTER PROCEDURE XXXX(
P_NAME_T1 TYPE OF T1.NAME,
P_NAME_T2 TYPE OF T2.NAME)
AS
DECLARE VARIABLE L_ID TYPE OF T1.ID;
BEGIN
INSERT INTO T1(NAME)
VALUES (:p_NAME_T1)
RETURNING ID INTO:L_ID;
INSERT INTO T2(NAME, T_ID)
VALUES (:P_NAME_T2, :l_ID);
END
如果支持返回语法,则可以直接在程序中使用存储过程中的两个语句。如果没有,则需要使用SELECT NEXT VALUE FOR GENERATOR_FOR_T1 FROM RDB$DATABASE;
的附加查询,并在两个INSERT语句中使用从它返回的值。