我需要一个稀疏表,其中包含另一个表的一组“覆盖”值。我还需要为被覆盖的项指定默认值。
例如,如果默认值为17,则foo、bar、baz的值为17、21、17:
table "things" table "xvalue"
name stuff name xval
---- ----- ---- ----
foo ... bar 21
bar ...
baz ...如果我不关心来自xvalue.name -> things.name的FK,我可以简单地放一个“默认”名称:
table "xvalue"
name xval
---- ----
DEFAULT 17
bar 21但我喜欢玩FK。我可以有一个单独的默认表,但是有2倍的表数似乎很奇怪。
table "xvalue_default"
xval
----
17
table "xvalue"
name xval
---- ----
bar 21我可以有一个“默认表”。
tablename attributename defaultvalue
xvalue xval 17但是后来我在defaultvalue上遇到了类型问题。
我的运维人员喜欢尽可能紧凑的表示,这样他们就可以最容易地看到与默认值的“差异”或偏差。
表示这一点的最佳方式是什么,包括默认值?这将适用于Oracle 10.2,如果这会有所不同的话。
发布于 2010-04-27 07:28:38
使用视图怎么样?在视图中,您对表xvalue执行外连接,如果xval为空,则使用coalesce函数返回默认值。
发布于 2010-04-28 01:17:07
我们可以在创建表时定义列的默认值...
SQL> create table t34 (
2 id number not null
3 , col1 varchar2(30) default user
4 , col2 date default sysdate
5 , col3 char(1) default 'N' )
6 /
Table created.
SQL>如果不指定任何内容,则会自动应用这些值:
SQL> insert into t34
2 (id)
3 values
4 (1)
5 /
1 row created.
SQL>或者,如果我们想指定一些值而不指定其他值,我们可以使用DEFAULT关键字
SQL> insert into t34
2 values
3 (2, null, default, 'Y')
4 /
1 row created.
SQL> select * from t34
2 /
ID COL1 COL2 C
---------- ------------------------------ --------- -
1 APC 27-APR-10 N
2 27-APR-10 Y
SQL>我们可以在数据字典视图USER_TAB_COLUMNS中找到默认值。不幸的是,DATA_DEFAULT使用的是卑劣的长数据类型,这降低了它的可用性。
SQL> select column_name, data_default
2 from user_tab_columns
3 where table_name = 'T34'
4 /
COLUMN_NAME DATA_DEFAULT
------------------------------ ------------------------------
ID
COL1 user
COL2 sysdate
COL3 'N'
SQL>重写值
存储一组重写值-替代默认值-更复杂。我担心您浮动的外键是不可启动的,因为我们不能在应用程序数据中引用数据字典的元数据。
我不完全清楚您试图解决的是什么业务问题,因此很难提出替代方案。但大多数方法可能需要动态SQL。
发布于 2010-04-28 02:53:52
我相信触发器是处理像这样的复杂业务规则的最佳方式。只需确保您将其设置(并测试)为当有人在一个操作中插入或更新多个行时工作。
https://stackoverflow.com/questions/2717615
复制相似问题