Как получить первичный ключ с нулевыми значениями, используя пустую строку?

У меня есть таблица, в которой мне нужно, чтобы оба значения были первичными, потому что я ссылаюсь на эту комбинацию как внешний ключ в других таблицах. Определение таблицы и данные, которые мне нужно поставить, следующие

create table T1 ( sno number(10), desc varchar2(10), constraint T1_PK primary key(sno,desc) ) DATA to put sno | desc --------------------------- 100 | "hundred" 000 | null 120 | "one twenty" 123 | "" <EMPTY STRING> 000 | "" <EMPTY STRING> 

Проблема здесь desc иногда может быть нулевой. Первичный ключ не может быть нулевым, поэтому, когда я сталкиваюсь с нулевым значением, я просто вставляю в таблицу. Проблема здесь в некоторых случаях desc может иметь пустую строку. Если я вставляю данные 100, Null и 100, «» – это две разные вещи, но я не могу их помещать в таблицу. Я не хочу помещать некоторую строку как «EMPTY», если null, потому что это может смутить конечного пользователя, который смотрит на таблицу.

1) Как я могу обрабатывать нулевой регистр для desc, имея его как первичный ключ. Я не могу использовать автоматический порядковый номер. 2) Как я могу различать пустую строку, введенную мной, и ту, которая уже существует?

Почему бы вам не ввести реальный атрибут первичного ключа (например, id), который автоматически увеличивается и создает индекс по sno и desc?

Oracle обрабатывает пустые поля VARCHAR как синонимы NULL , что несколько противоречиво, но с этим вам нужно жить. Таким образом, вы не можете поместить пустую строку в первичный ключ, потому что вы не можете поместить NULL в первичный ключ.

Мой совет? Используйте технический первичный ключ, например число (с автоматическим добавлением в MySQL / SQL Server, от SEQUENCE в Oracle). Поместите уникальный индекс в пару других полей. Так:

 CREATE TABLE t1 ( id NUMBER(10) PRIMARY KEY, sno NUMBER(10), desc VARCHAR2(10) ); CREATE SEQUENCE t1_seq; 

desc никогда не должен никогда быть в первичном ключе. Он просто не нуждается в этом. Прочитайте, пожалуйста, первичный ключ, в теории реляционных баз данных.

Тем не менее, то, что вы хотите, невозможно – по теории реляций, первичным ключам не разрешается использовать неопределенные значения, поскольку они должны быть уникальными – это часть разворачивания SQL-логики.

Кто-то ДЕЙСТВИТЕЛЬНО сделал плохую работу в вашем проекте базы данных. Стрельба плохо.

Используйте CHAR вместо VARCHAR. Пусто будет пустым. Было бы необходимо установить пробел вместо пустой строки, чтобы Oracle не конвертировал пустую строку в NULL. Обратите внимание, что в поле CHAR пробел совпадает с двумя пробелами, тремя пробелами … (но он отличается от нуля пробелами для Oracle).