“常量表” - 这是常见的做法吗?

mjf*_*tes 8 best-practices

大学 SQL 课程,使用 John J. Patrick 所著的“SQL Fundamentals”一书。在第三章中,他谈到使用“常量表”向 select 语句添加列,其中所有行都具有相同的值。

例如,如果您有表“字符”,如下所示:

first_name  last_name  dept_code
----------- ---------- -------------------
Fred        Flintstone ROCKS
Barney      Rubble     ROCKS
Wilma       Flintstone FACEPALMING_AT_FRED
Run Code Online (Sandbox Code Playgroud)

并且您想要一个 SELECT 向所有行添加值为“BEDROCK”的列“hometown”,他建议在数据库中创建第二个表“temp”,

hometown
--------
BEDROCK
Run Code Online (Sandbox Code Playgroud)

然后做

SELECT first_name, last_name, dept_code, hometown FROM characters, temp
Run Code Online (Sandbox Code Playgroud)

这个想法是避免将字符串常量放在 SELECT 语句中,并且如果您有很多需要相同常量的 SELECT,更新一个表比更新 50 个查询更容易。

问题是,过去 15 年来我一直在使用 SQL 数据库,但我从未见过这种结构。它是我刚刚错过的完全常见的东西,还是在这个任务结束后我可以从我的记忆中抹去的东西?

Mar*_*ith 9

Joe Celko 在他的几本书中提到了常量表。

他建议,如果使用添加了检查约束的表,以确保该表最多包含一行。

CREATE TABLE Constants
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY CHECK (lock = 'X'),
pi FLOAT DEFAULT 3.142592653 NOT NULL,
e FLOAT DEFAULT 2.71828182 NOT NULL,
phi FLOAT DEFAULT 1.6180339887 NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

或者,视图可以用于类似的目的。

CREATE VIEW Constants
AS
SELECT *
FROM 
(VALUES(3.142592653,
        2.71828182,
        1.6180339887)) V(pi,e,phi)
Run Code Online (Sandbox Code Playgroud)

不是我自己经常使用的东西,如果有的话,但总是值得考虑其他可能的技术。

您问题中的具体用例不是我会考虑的常量表。TBH 为每个人硬编码相同的“家乡”似乎是一个荒谬的要求。

  • 视图解决方案非常好。它还可以防止对“常量”的意外更改。 (2认同)