MySQL常量表

时间:2013-05-04 09:39:50

标签: mysql database-design constants

如何在mysql中创建一个常量表,该表将匹配一个类型(使用int来区分不同类型)与该类型的全名。常量表应该是只读的,并且预计不需要仅更改或更新读数。

CREATE TABLE Accounts (
    AccountType INT,
    ...
);

CREATE TABLE AccountTypes (
    TypeId INT,
    TypeName VARCHAR(255),
);

在Java中有ImmutableMap<Integer><String>(在Guava中)或带有整数实例变量的枚举,在C ++中还有枚举或static const string[...] ... = { ... },其中类型整数是索引。

这可能,还是有更好的选择?

2 个答案:

答案 0 :(得分:2)

看起来你需要类似的东西:

CREATE TABLE AccountType (
    TypeId INT PRIMARY KEY,
    TypeName VARCHAR(255),
    TypeShortName VARCHAR(255)
);

INSERT INTO AccountType VALUES
    (1, 'Foo', 'F'),
    (2, 'Bar', 'Br'),
    (3, 'Baz', 'Bz');

CREATE TRIGGER AccountTypeInsertTrigger BEFORE INSERT ON AccountType FOR EACH ROW
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Cannot INSERT - the AccountType table is read-only.';

CREATE TRIGGER AccountTypeUpdateTrigger BEFORE UPDATE ON AccountType FOR EACH ROW
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Cannot UPDATE - the AccountType table is read-only.';

CREATE TRIGGER AccountTypeDeleteTrigger BEFORE DELETE ON AccountType FOR EACH ROW
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Cannot DELETE - the AccountType table is read-only.';

基本上,您只需定义一个普通表并用数据填充,然后使用触发器禁止任何更改。

根据MySQL documentation要发信号通用SQLSTATE值,请使用“45000”,表示“未处理的用户定义的异常。”


或者,REVOKE除适当用户的SELECT之外的所有权限。

答案 1 :(得分:0)

如果您想拥有多种帐户类型,每种帐户类型都包含一些详细信息(例如名称),并且每个帐户都应与一种帐户类型相关联,则可以创建表格,如

CREATE TABLE Accounts (
AccountId INT(10) PRIMARY KEY,
AccountType INT(10) NOT NULL, FOREIGN KEY (AccountType) REFERENCES AccountTypes (TypeId),
... 
);

CREATE TABLE AccountTypes (
TypeId INT(10) PRIMARY KEY,
TypeName VARCHAR(255),
);

这将确保添加到Accounts的所有行都具有与已注册的某个帐户类型相对应的AccountType。

查看http://en.wikipedia.org/wiki/Foreign_key