SQL设计:使用覆盖表示默认值?

时间:2010-04-26 23:15:55

标签: sql oracle database-design default-value

我需要一个稀疏表,其中包含一组“覆盖”值 另一张桌子。我还需要指定默认值 物品被覆盖。

例如,如果默认值为17,则foo,bar,baz将具有 值17,21,17:

table "things"   table "xvalue"
name  stuff      name xval
----  -----      ---- ----
 foo  ...         bar   21
 bar  ...
 baz  ...

如果我不关心xvalue.name中的FK - > things.name,我可以简单 提出“默认”名称:

                 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。

5 个答案:

答案 0 :(得分:1)

我们可以在创建表时为列定义默认值...

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属于卑鄙的LONG数据类型,这降低了它的可用性。

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。

答案 1 :(得分:0)

使用视图怎么样?在视图中,您对表xvalue执行外连接,然后使用coalesce函数在xval为null时返回默认值。

答案 2 :(得分:0)

我认为触发器是处理这种复杂业务规则的最佳方式。当有人在一个操作中插入或更新多行时,请确保将其设置(并进行测试)。

答案 3 :(得分:0)

这是否符合您的意图?

SELECT TABLE_NAME, STUFF, NVL(XVAL, 17) XVAL
FROM THINGS, XVALUE
WHERE THINGS.TABLE_NAME(+) = XVALUE.TABLE_NAME

答案 4 :(得分:0)

首先,使用列定义的默认值设置。

如果由于某种原因你无法做到这一点,请做其他几件事:

  1. 创建表结构的副本,其中包含一个包含默认值的记录。在插入时,将该表中的数据与您传递的数据合并。 (最难的3)。
  2. 写一个触发器并在那里处理
  3. 如果所有插入/更新都是通过存储过程(我的正常推荐)关闭,那么在你的过程中处理它。
  4. 如果您在代码中创建sql,请参阅此答案的第一行。
  5. 我真的不能想到我会将默认值存储在名称/值对表中的情况。太难以为此工作了。