【问题标题】:Removing all references from a tuple using Oracle/Access使用 Oracle/Access 从元组中删除所有引用
【发布时间】:2010-12-22 04:11:29
【问题描述】:

我使用 Oracle 创建了一个简单的数据库,它有几个表和一些约束,我正在使用 Access 2007 与数据库交互。

我的问题是我有一个名为“客户”的表,其中包含多个字段,最值得注意的是一个名为 CUSTID 的主键。

我有另一个名为“订单”的表,它使用“客户”中的主键作为外键。

显然,如果我尝试删除正在“订单”中使用的客户,我会在使用时收到错误消息。这意味着我必须删除引用客户的特定订单,然后我才能删除客户记录。

我知道“级联”应该删除与之关联的所有内容,我的问题是如何从 Access 中执行此操作?我对数据库的了解有限,但足以创建一个等等。

这更像是一种验证,只是在删除某些元组之前删除另一个元组很麻烦。

这是为 Oracle 创建的数据库:

--用于创建“干净”的石板 删除表项级联约束; 删除表客户级联约束; DROP TABLE CORDER 级联约束; 丢弃表论坛级联约束; 创建表项 ( 项目编号(4)不为空, 名称 CHAR(15) 非空, 类别 CHAR(15) 非空, 价格编号(8)不为空, CONSTRAINT ITEM_PK PRIMARY KEY (ITEMID) ); 插入项目值(1000,'CARROT SEEDS','PACKET SEEDS',2.99); 插入项目值 (2250,'ROSES','FLOWERS',5.99); 插入项目值(3300,'西红柿','包种子',2.99); 插入项目值(4050,'POTATOES','PACKET SEEDS',1.99); 创建表客户 ( 客户编号 (4) 不为空, FNAME CHAR(10) 非空, LNAME CHAR(10) 非空, 地址 CHAR(40) 非空, 城市字符(15)不为空, PCODE CHAR(7) 非空, CNUMBER NUMBER(11) 非空, 约束 CUSTOMER_PK 主键 (CUSTID) ); 插入客户价值(1010,'JAMIE','KEELING','149 OLD MANSFIELD ROAD','DERBY','DE214SA',07500966490); 插入客户价值(2020,'HELEN','DARLINGTON','27 MOORPARK AVENUE','ROCHDALE','OL113JQ',07890189802); 插入客户价值(3030,'STEVEN','SEGAL','123 FAKE STREET','OHIO','SE095BG',01559345467); 插入客户价值(4040,'BRUCE','WAYNE','17 LAKEVIEW CRESENT','CHICAGO','MN432BD',07500966490); 创建表绳 ( 订单号(4)不为空, 客户编号 (4) 不为空, SHIPADD CHAR(40) 非空, SHIPPCODE CHAR(7) 非空, 发货日期, 项目编号(4)不为空, 数量编号(3)不为空, 总数(8)不为空, 约束 ORDER_PK 主键(ORDERID), CONSTRAINT FK_CUSTOMER FOREIGN KEY (CUSTID) REFERENCES CUSTOMER(CUSTID), CONSTRAINT FK_ITEM FOREIGN KEY (ITEMID) REFERENCES ITEM(ITEMID) ); INSERT INTO CORDER VALUES (1000,1010,'149 OLD MANSFIELD ROAD','DE214SA','12-JAN-07',1000,100,100.00); INSERT INTO CORDER VALUES (2000,2020,'27 MOORPARK AVENUE','OL113JQ','04-NOV-10',2250,200,100.00); INSERT INTO CORDER VALUES (3000,3030,'123 FAKE STREET','SE095BG','30-OCT-08',3300,150,100.00); INSERT INTO CORDER VALUES (4000,4040,'17 LAKEVIEW CRESCENT','MN432BD','25-JUL-07',4050,125,100.00); 创建表论坛 ( FORUMID NUMBER(4) NOT NULL, 标题字符(30)不为空, 线程名 CHAR(30) 非空, 海报字符(20)不为空, 后日期, 约束 FORUM_PK 主键 (FORUMID) ); 插入论坛值(1001,'一般聊天','初学者问题','JAMIE KEELING','25-NOV-09'); INSERT INTO FORUM VALUES(2002,'OFF TOPIC','Favorite BAND','HELEN DARLINGTON','12-JAN-09'); 插入论坛值(3003,'一般聊天','何时收获?','布鲁斯韦恩','02-NOV-08'); 插入论坛值(4004,'OFF TOPIC','你住在哪里?','STEVEN SEGAL','13-JAN-08');

【问题讨论】:

  • 为什么所有这些 CHAR 列?将它们更改为 varchar2 列,因为 varchar2 列使用较少的空间,varchar2 列没有空白填充。
  • 这只是为了让它工作,等它功能齐全后我会开始优化

标签: sql oracle


【解决方案1】:

使用 ON DELETE CASCADE 创建 foreign key 的标准 SQL 方法如下。我不知道 Access 是否支持这个,但 Oracle 确实支持 ON DELETE CASCADE。

更改表 CORDER 添加外键 FK_CUSTOMER 参考客户(custid) 在删除级联

如果要重新创建表,还可以在表创建语句中使用 on delete cascade 定义外键。即替换这个

约束 FK_CUSTOMER 外键 (CUSTID) 参考 CUSTOMER(CUSTID)

有了这个

CONSTRAINT FK_CUSTOMER FOREIGN KEY (CUSTID) REFERENCES CUSTOMER(CUSTID) ON DELETE CASCADE

【讨论】:

  • Access 是否支持级联删除不是问题。问题是 Oracle 是否支持级联删除,而 Oracle 是否支持级联删除。
  • Access 只是客户端,Oracle 才是真正的工作。但是,您的 SQL 语法将起作用。
  • 太棒了,当我回到正确的计算机上时,我会使用它,如果它工作会更新=]
猜你喜欢
  • 1970-01-01
  • 2019-02-15
  • 2014-10-30
  • 2016-10-28
  • 2022-01-26
  • 2013-09-09
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多