Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.
Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
Здравствуйте, Darooma, Вы писали:
D>Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть. D>Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
Никак, поскольку это не связь один к одному. А то, что Вы хотите, делается так:
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Darooma, Вы писали:
D>>Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть. D>>Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
S>Никак, поскольку это не связь один к одному. А то, что Вы хотите, делается так:
S>
Здравствуйте, Darooma, Вы писали:
D> Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть. D> Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
сделать связь в другую сторону.
create table User(id integer);
create table Customer(id integer, userId integer);
ALTER TABLE ONLY User
ADD CONSTRAINT user_pkey PRIMARY KEY (id);
ALTER TABLE ONLY Customer
ADD CONSTRAINT customer_pkey PRIMARY KEY (id);
ALTER TABLE ONLY Customers
ADD CONSTRAINT customer_userId_unique UNIQUE (userId);
Здравствуйте, ., Вы писали:
.>Здравствуйте, Darooma, Вы писали:
D>> Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть. D>> Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers? .>сделать связь в другую сторону. .>
Здравствуйте, Darooma, Вы писали:
D>Тут будет разрешен только один NULL на всю таблицу. Мне это не подходит.
Плюньте в лицо тому, кто Вам сказал такую глупость. Либо выбросьте нафиг СУБД, не поддерживающую основы ANSI стандарта (помнится, этим грешил MS SQL, неужели до сих пор не исправили?). Либо подумайте, как доработать эту схему для такой СУБД (это не сложно).
Здравствуйте, Darooma, Вы писали:
D>Не вижу ни внешнего ключа между таблицами,
Да, забыл. Ключ Customer.userId->User.id очевидно.
D>ни возможности добавлять Null значения в customer_userId_unique
Так не надо null! Вообще поле userId not null надо объявить. Связь же в обратную сторону. Если Customer-а нет, то просто нет записи, и никто не ссылается на User-а.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
.> Связь же в обратную сторону. Если Customer-а нет, то просто нет записи,
Это... сильное требование. Представьте, например, что эта связь имеет смысл "сотрудник, отвечающий за этого клиента". Вы всерьёз предлагаете удалять записи клиентов, по каким-либо причинам оставшихся без ответственного сотрудника?
Здравствуйте, Softwarer, Вы писали:
S> Это... сильное требование. Представьте, например, что эта связь имеет смысл "сотрудник, отвечающий за этого клиента". Вы всерьёз предлагаете удалять записи клиентов, по каким-либо причинам оставшихся без ответственного сотрудника?
А, в смысле есть есть Юзер, есть Кастомер. И некоторые юзеры имеют ссылку на разных кастомеров? Тогда третья табличка-связь:
create table UserCustomer(userId, customerId);
ALTER TABLE ONLY UserCustomer
ADD CONSTRAINT userCustomer_userId_unique UNIQUE (userId);
ALTER TABLE ONLY UserCustomer
ADD CONSTRAINT userCustomer_customerId_unique UNIQUE (customerId);
ALTER TABLE ONLY UserCustomer
ADD CONSTRAINT userCustomer_customerId_pk PRIMARY KEY (userId, customerId);