【问题标题】:Delete data from Oracle tables从 Oracle 表中删除数据
【发布时间】:2016-02-14 20:09:14
【问题描述】:

我想从用于存储数据的 Oracle 表中删除数据。

  -- TABLE AGENT_HISTORY

CREATE TABLE AGENT_HISTORY(
  EVENT_ID INTEGER NOT NULL,
  AGENT_ID INTEGER NOT NULL,
  EVENT_DATE DATE NOT NULL
)
/

-- CREATE INDEXES FOR TABLE AGENT_HISTORY

CREATE INDEX IX_RELATIONSHIP1 ON AGENT_HISTORY (AGENT_ID)
/

-- ADD KEYS FOR TABLE AGENT_HISTORY

ALTER TABLE AGENT_HISTORY ADD CONSTRAINT KEY8 PRIMARY KEY (EVENT_ID)
/

-- TABLE CPU_HISTORY

CREATE TABLE CPU_HISTORY(
  CPU_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER NOT NULL,
  CPU_NAME VARCHAR2(50 ) NOT NULL,
  CPU_VALUE NUMBER NOT NULL
)
/

-- CREATE INDEXES FOR TABLE CPU_HISTORY

CREATE INDEX IX_RELATIONSHIP5 ON CPU_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE CPU_HISTORY

ALTER TABLE CPU_HISTORY ADD CONSTRAINT KEY9 PRIMARY KEY (CPU_HISTORY_ID)
/

-- TABLE CPU_TEMP_HISTORY

CREATE TABLE CPU_TEMP_HISTORY(
  CPU_TEMP_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  CPU_TEMP_NAME VARCHAR2(50 ) NOT NULL,
  CPU_TEMP_VALUE NUMBER NOT NULL
)
/

-- CREATE INDEXES FOR TABLE CPU_TEMP_HISTORY

CREATE INDEX IX_RELATIONSHIP7 ON CPU_TEMP_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE CPU_TEMP_HISTORY

ALTER TABLE CPU_TEMP_HISTORY ADD CONSTRAINT KEY10 PRIMARY KEY (CPU_TEMP_HISTORY_ID)
/

-- TABLE MEMORY_HISTORY

CREATE TABLE MEMORY_HISTORY(
  MEMORY_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  MEMORY_NAME VARCHAR2(50 ) NOT NULL,
  MEMORY_VALUE NUMBER NOT NULL
)
/

-- CREATE INDEXES FOR TABLE MEMORY_HISTORY

CREATE INDEX IX_RELATIONSHIP9 ON MEMORY_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE MEMORY_HISTORY

ALTER TABLE MEMORY_HISTORY ADD CONSTRAINT KEY11 PRIMARY KEY (MEMORY_HISTORY_ID)
/

-- TABLE DISK_HISTORY

CREATE TABLE DISK_HISTORY(
  DISK_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  DISK_NAME VARCHAR2(50 ) NOT NULL,
  DISK_READ_VALUE NUMBER NOT NULL,
  DISK_WRITE_VALUE NUMBER
)
/

-- CREATE INDEXES FOR TABLE DISK_HISTORY

CREATE INDEX IX_RELATIONSHIP10 ON DISK_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE DISK_HISTORY

ALTER TABLE DISK_HISTORY ADD CONSTRAINT KEY12 PRIMARY KEY (DISK_HISTORY_ID)
/

-- TABLE NETWORK_HISTORY

CREATE TABLE NETWORK_HISTORY(
  NETWORK_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  ADAPTER_NAME VARCHAR2(50 ) NOT NULL,
  TRANSMITBYTES NUMBER NOT NULL,
  TRANSMITSPEED NUMBER,
  RECEIVESPEED NUMBER,
  RECEIVEBYTES NUMBER
)
/

-- CREATE INDEXES FOR TABLE NETWORK_HISTORY

CREATE INDEX IX_RELATIONSHIP11 ON NETWORK_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE NETWORK_HISTORY

ALTER TABLE NETWORK_HISTORY ADD CONSTRAINT KEY13 PRIMARY KEY (NETWORK_HISTORY_ID)
/

-- TABLE SWAP_HISTORY

CREATE TABLE SWAP_HISTORY(
  SWAP_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  SWAP_NAME VARCHAR2(50 ) NOT NULL,
  SWAP_VALUE NUMBER NOT NULL
)
/

-- CREATE INDEXES FOR TABLE SWAP_HISTORY

CREATE INDEX IX_RELATIONSHIP13 ON SWAP_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE SWAP_HISTORY

ALTER TABLE SWAP_HISTORY ADD CONSTRAINT KEY14 PRIMARY KEY (SWAP_HISTORY_ID)
/

-- TABLE CONNECTIONS_HISTORY

CREATE TABLE CONNECTIONS_HISTORY(
  CONNECTIONS_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  CONNECTIONS_NAME VARCHAR2(50 ) NOT NULL,
  CONNECTIONS_VALUE NUMBER NOT NULL
)
/

-- CREATE INDEXES FOR TABLE CONNECTIONS_HISTORY

CREATE INDEX IX_RELATIONSHIP14 ON CONNECTIONS_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE CONNECTIONS_HISTORY

ALTER TABLE CONNECTIONS_HISTORY ADD CONSTRAINT KEY15 PRIMARY KEY (CONNECTIONS_HISTORY_ID)
/

-- TABLE PARTITIONS_HISTORY

CREATE TABLE PARTITIONS_HISTORY(
  PARTITIONS_HISTORY_ID INTEGER NOT NULL,
  EVENT_ID INTEGER,
  PARTITIONS_NAME VARCHAR2(50 ) NOT NULL,
  PARTITIONS_VALUE NUMBER NOT NULL
)
/

-- CREATE INDEXES FOR TABLE PARTITIONS_HISTORY

CREATE INDEX IX_RELATIONSHIP15 ON PARTITIONS_HISTORY (EVENT_ID)
/

-- ADD KEYS FOR TABLE PARTITIONS_HISTORY

ALTER TABLE PARTITIONS_HISTORY ADD CONSTRAINT KEY16 PRIMARY KEY (PARTITIONS_HISTORY_ID)
/

如何通过一次 SQL 查询从 Oracle 表中删除超过 3 个月的所有数据?

我可以只使用一个 SQL 查询吗?也许有级联删除?

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    确实,您应该添加一个外键约束,当您删除相应的父记录时,将删除子记录:

    ALTER TABLE CPU_HISTORY 
    ADD CONSTRAINT FK_CPU_HIST_EVENT_ID
    FOREIGN KEY (EVENT_ID)
         REFERENCES AGENT_HISTORY (EVENT_ID)
         ON DELETE CASCADE;
    

    您将只执行上述语句一次。

    请注意,如果 CPU_HISTORY 中的记录具有未知的 EVENT_ID(不在 AGENT_HISTORY 中),则上述语句将失败。在这种情况下,请先清理这些孤立记录。

    对所有具有引用 AGENT_HISTORY 的 EVENT_ID 的表重复此操作。请注意,您需要使用唯一的名称来命名所有这些外键。

    然后用这个删除:

    DELETE 
    FROM    AGENT_HISTORY
    WHERE   EVENT_DATE < ADD_MONTHS(SYSDATE, -3);
    

    ...相应的记录(具有相同的 EVENT_ID)将从 CPU_HISTORY(以及您已应用相同 CASCADE DELETE 外键的其他表)中删除。

    【讨论】:

    • 我不明白你的意思。你能澄清一下吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多