2013-11-14 11 views
0

Я создаю небольшую базу данных MYSQL, и у меня в настоящее время проблема с моим HOME. Его атрибуты: ROOM_NUM и BUILD_CODE. Эти два составляют составной первичный ключ с внешним ключом BUILD_CODE, который ссылается на то, в каком здании он находится.Использование части первичного ключа в качестве внешнего ключа

Мне было интересно, можно ли BUILD_CODE быть единственным символом ('a', 'b', 'c 'и т. д.), а затем первичным ключом для HOME является нечто вроде «A302» или «B205». Первый символ этого первичного ключа будет ссылаться на BUILD_CODE, а остальные номера будут номером комнаты. Тогда у меня будет уникальный первичный ключ с одним значением. Причина, по которой я спрашиваю, заключается в том, что мне не нужно иметь несколько внешних ключей в моей таблице PERSON, ссылающейся на HOME.

ответ

0

Вы можете использовать суррогатный ключ (последовательность) в качестве первичного ключа объекта HOME и использовать его как внешний ключ ЧЕЛОВЕКА. А затем для BUILD_CODE и ROOM_NUM объявите уникальный ключ для сохранения уникальности комбинации.

0

Похоже, что ДОМАШНИЕ потребности отдельный идентификатор. И не имеет значения, что такое идентификатор ... пока он уникален.

Рассмотрим следующий пример:

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 имеет ID значения, которые не говорят много об остальных своих данных ... Вы используете только это поле как инструмент для объединения двух вместе.

Конечно, вы могли бы так же легко иметь INSERT Эду конкатенация BUILD_CODEROOM_NUM и полей в ID поле ... Это было бы тоже хорошо. Но имейте в виду, что (a) поиск строк использует больше ресурсов, чем целые поиски, и (б) это всего лишь одна вещь, которую ваше приложение должно поддерживать (например: что произойдет, если вы начнете вычислять номера комнат как A302, но затем, увидев большие номера комнат, вы решаете на A00302? Вам придется пройти через всю таблицу - и все ее ассоциации - и обновить ID. Это не очень хорошо).

+0

Это было бы идеально для того, что я делаю. Эта база данных предназначена в основном для тестирования части программного обеспечения, которое создает моя команда. Как я могу создать объединенный первичный ключ от BUILD_CODE и ROOM_NUM? – user2967236

+0

Во-первых, вам нужно убедиться, что поле «ID» является «VARCHAR» вместо автоматического инкремента «INTEGER». Затем вы можете просто сделать что-то вроде: «INSERT INTO HOME» (ID, ROOM_NUM, BUILD_CODE) ЗНАЧЕНИЯ (CONCAT («A», 302), 302, «A»); ' –

+0

Есть ли способ автоматически получить идентификатор из ROOM_NUM и BUILD_CODE, или мне просто нужно сделать это вручную для каждого объекта, введенного в таблицу? – user2967236

Смежные вопросы