我有以下表格定義,其中的資料創建得很好,但我喜歡將其轉換為更通用的格式,但我遇到了問題。有人能指出我正確的方向嗎
CREATE TABLE partition_retention
(
seq_num NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
TABLE_NAME VARCHAR2(30),
DAYS NUMBER(6),
CONSTRAINT
partition_retention_pk primary key (table_name));
/
INSERT into partition_retention(TABLE_NAME, DAYS)
WITH data as (
select 'T1', 0
from dual union all
select 'T3', 15
from dual union all
select 'T4', 10
from dual union all
select 'T5', 5
from dual)
SELECT * from data;
/
-- having problem creating
CREATE TABLE PARTITION_RETENTION AS (
TABLE_NAME AS VARCHAR2(30)
RETENTION DAY AS INTERVAL DAY(3) TO SECOND(0)
);
uj5u.com熱心網友回復:
這三個AS關鍵字無效(create table .. as select ..有效,但您沒有這樣做);你少了一個逗號;并且您有一個帶空格的不帶引號的列名。
糾正這些事情,這有效:
CREATE TABLE PARTITION_RETENTION (
TABLE_NAME VARCHAR2(30),
RETENTION_DAY INTERVAL DAY(3) TO SECOND(0)
);
顯然,您的插入必須插入interval值,而不是簡單的數字。
db<>小提琴
如何在表格上添加一個約束以確保日期>0并且時間始終為 0
您可以添加單獨的約束來檢查這兩件事:
CREATE TABLE PARTITION_RETENTION (
TABLE_NAME VARCHAR2(30),
RETENTION_DAY INTERVAL DAY(3) TO SECOND(0),
CONSTRAINT CHK_NON_ZERO_DAYS CHECK (
RETENTION_DAY > INTERVAL '0' DAY
),
CONSTRAINT CHK_WHOLE_DAYS CHECK (
EXTRACT(HOUR FROM RETENTION_DAY) = 0
AND EXTRACT(MINUTE FROM RETENTION_DAY) = 0
AND EXTRACT(SECOND FROM RETENTION_DAY) = 0
)
);
給出稍微不同的錯誤(通過約束名稱) - db<>fiddle - 或將它們組合成一個。
我不確定這是否真的比將數字列限制為 1 到 999 之間的整數更清晰或更容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428097.html
上一篇:使用regexp_substr獲取第3和第4個空格之間的字串
下一篇:oraclesql查詢3表連接
