我正在构建一个小型的MYSQL数据库,我目前在使用我的权利主页时遇到了问题。它的属性是ROOM_NUM和BUILD_CODE。这两个组成一个复合主键,外键BUILD_CODE引用它所在的建筑物。
我想知道是否可以将BUILD_CODE设为一个字符('a','b','c'等等...)然后将HOME的主键设置为“A302”或“B205”。该主键的第一个字符将引用BUILD_CODE,其余数字为房间号。然后我会有一个唯一的单值主键。我问的原因是我的PERSON表中没有多个外键引用HOME。
答案 0 :(得分:0)
您可以使用代理键(序列)作为实体HOME的主键,并将其用作PERSON的外键。然后为BUILD_CODE和ROOM_NUM声明一个唯一键以保持组合的唯一性。
答案 1 :(得分:0)
听起来HOME需要自己的单独的标识符。 ID是什么并不重要......只要它是唯一的。
请考虑以下事项:
mysql> CREATE TABLE HOME (ID INTEGER NOT NULL auto_increment, ROOM_NUM INTEGER, BUILD_CODE VARCHAR(1), PRIMARY KEY(ID));
Query OK, 0 rows affected (0.14 sec)
mysql> CREATE TABLE PERSON(ID INTEGER NOT NULL auto_increment, NAME VARCHAR(255), HOME_ID INTEGER, PRIMARY KEY(ID), FOREIGN KEY(HOME_ID) REFERENCES HOME(ID));
Query OK, 0 rows affected (0.14 sec)
mysql> INSERT INTO HOME (ROOM_NUM, BUILD_CODE) VALUES (302, "A"), (205, "B");
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM HOME;
+----+----------+------------+
| ID | ROOM_NUM | BUILD_CODE |
+----+----------+------------+
| 1 | 302 | A |
| 2 | 205 | B |
+----+----------+------------+
2 rows in set (0.00 sec)
mysql> INSERT INTO PERSON (NAME, HOME_ID) VALUES ("someone", 1);
Query OK, 1 row affected (0.05 sec)
mysql> SELECT * FROM PERSON;
+----+---------+---------+
| ID | NAME | HOME_ID |
+----+---------+---------+
| 1 | someone | 1 |
+----+---------+---------+
1 row in set (0.00 sec)
mysql> SELECT PERSON.NAME, HOME.BUILD_CODE, HOME.ROOM_NUM FROM HOME JOIN PERSON ON PERSON.HOME_ID = HOME.ID;
+---------+------------+----------+
| NAME | BUILD_CODE | ROOM_NUM |
+---------+------------+----------+
| someone | A | 302 |
+---------+------------+----------+
1 row in set (0.00 sec)
你知道,HOME
的{{1}}值与其余的数据没有多大关系并不重要...... 你只是使用那个字段作为将两者结合在一起的工具。
当然,您可以轻松ID
将INSERT
和BUILD_CODE
字段串联到ROOM_NUM
字段中......这也很好。但请记住,(a)字符串查找比整数查找使用更多资源,(b)它只是您的应用程序需要维护的一件事(例如:如果您通过计算房间号码A302开始会发生什么,但是在看到更大的房间号后,你决定A00302?你必须经历整个表 - 及其所有关联 - 并更新ID
。这不是非常理想的。