2016-03-28 4 views
1

Скажем, у меня есть дерево таблицы и таблицы special_treePostgreSQL UNIQUE ограничение и ЛИТЕРАТУРЫ

CREATE TABLE tree VALUES (name VARCHAR(32) UNIQUE NOT NULL PRIMARY KEY, 
          type VARCHAR(32) NOT NULL); 

CREATE TABLE special_tree VALUES (name NOT NULL REFERENCES tree(name), 
            treat_date DATE, 
            id INT NOT NULL PRIMARY KEY); 

Поэтому у меня есть таблица, содержащая список деревьев с уникальными именами, но я хочу сказать, что дерево может иметь несколько 'treat_date' (по разным причинам). Поскольку дерево (имя) уникально, я не могу добавить одно имя в special_tree.

Единственное решение - удалить уникальное дерево, а затем добавить всюду. Я обрабатываю таблицу дерева инструкцией IF, чтобы проверить, нет ли имени там еще? (IF EXISTS (SELECT name FROM tree where tree.name = ...))

+0

'Имя' из 'дерева' should'n использовать в качестве row id, добавьте новое поле в 'tree' для id, например: 'id' int (11) NOT NULL auto_increment и установите его как primarykey, –

+0

Конечно, но это просто пример, это не помогает мне с уникальным name положение дел. Хорошо, я понял, вы хотите, чтобы я ссылался на идентификатор. – sourpet

+0

нет причин устанавливать на name unique constrain –

ответ

0

Если вы считаете столбец name таблицы tree, это не означает, что все ссылочные столбцы также должны иметь уникальные значения. Посмотрите на this example

+0

Nop ... Вы, например, не работаете. https://i.gyazo.com/bf85955fba9bc8c7530f6f90c3af7d82.png Это именно моя проблема. – sourpet

+0

Он работает как есть? Почему вы пытаетесь вставить значения еще раз? Однако вы можете заметить, что ваша попытка нарушает ограничение первичного ключа, а не уникальное. – max

+0

Чтобы проверить пример, просто создайте схему и выполните любой запрос на выбор. – max

0

лучшим решением для этого является (для MySQL):

CREATE TABLE tree VALUES (
    id_t int(11) NOT NULL auto_increment, 
    name VARCHAR(32) NOT NULL, 
    type VARCHAR(32) NOT NULL, 
CONSTRAINT tree_pk PRIMARY KEY (id_t)); 

CREATE TABLE special_tree VALUES (
    id_st int(11) NOT NULL auto_increment, 
    id_t NOT NULL REFERENCES tree(id_t), 
    treat_date DATE, 
    CONSTRAINT special_tree_pk PRIMARY KEY (id_st)); 

для PostgreSQL:

CREATE TABLE tree VALUES (
    id_t serial primary key, 
    name VARCHAR(32) NOT NULL, 
    type VARCHAR(32) NOT NULL); 

CREATE TABLE special_tree VALUES (
    id_st serial primary key, 
    id_t NOT NULL REFERENCES tree(id_t), 
    treat_date DATE); 
Смежные вопросы