我必须制作一张有一些规格和限制的表格。我对自动表创建不是很熟悉。我必须为Oracle DB做这个。 表名:A0
Primary key (NUMBER), A0_PK
Date (DATE), A0_DATE
VARCHAR2, A0_INTERVAL
Value (NUMBER), A0_VALUE
Other 1000 columns, called for example. A0_COL_058
表应填充100.000行,随机值,带约束:
Primary key is sequential: 1, 2, 3...
Date: only days (without time) for year 2013.
A0_INTERVAL, like date but string in YYYYMMDD format
Value: number in [0, 100]
Others: null
我必须制作一个剧本?脚本文件的扩展名和执行位置是什么? 有人可以指出我正确的方向,我会非常感激。
答案 0 :(得分:1)
对于基本设置,我建议采用以下几行:
CREATE TABLE A0 (
a0_pk NUMBER
, a0_date DATE
, a0_interval VARCHAR2(20)
, a0_value NUMBER
, CONSTRAINT c_a0_pk PRIMARY KEY (a0_pk)
, CONSTRAINT c_a0_date CHECK ( a0_date >= TO_DATE ( '01.01.2013 00:00:00', 'DD.MM.YYYY HH24:MI:SS' ) AND a0_date < TO_DATE ( '01.01.2014 00:00:00', 'DD.MM.YYYY HH24:MI:SS' ) )
, CONSTRAINT c_a0_value CHECK ( a0_value BETWEEN 0 AND 100 )
);
BEGIN
FOR i IN 1 .. 100 LOOP
INSERT
INTO A0
( a0_pk
, a0_date
, a0_value
)
VALUES
( i
, TO_DATE ( '01.01.2013 00:00:00', 'DD.MM.YYYY HH24:MI:SS' ) + 365 * DBMS_RANDOM.VALUE
, TO_CHAR ( a0_date, 'YYYYMMDD' )
, FLOOR ( DBMS_RANDOM.VALUE ( 0, 101 ) )
)
;
END LOOP;
END;
UPDATE A0
SET a0_interval = TO_CHAR ( a0_date, 'YYYYMMDD' )
;
COMMIT;
ALTER TABLE A0 ADD CONSTRAINT c_a0_interval CHECK ( TO_CHAR ( a0_date, 'YYYYMMDD' ) = a0_interval );
请注意,如果您不需要dbms强制执行约束,则可以省略表创建语句中除pk约束之外的CONSTRAINT
行。
在创建表之后,所有剩余的列都可以通过
ALTER TABLE A0 ADD ( A0_COL_001 NUMBER );
给定1000列的数量,语句列表最好由一些简短的perl脚本生成。或者,在电子表格中填写3列。第1列应分别保存字符串a
,第3列b
的1000个实例。使用0到999之间的数字填充column2,并将它们格式化为带有前导零的3位数。将结果保存为csv文件。假设您选择a;
作为csv分隔符,分别将ALTER TABLE A0 ADD ( A0_COL_
替换为;b
,将NUMBER );
替换为;
来编辑该文件。