Ограничение на уникальность данных на несколько столбцов

Используйте подход на основе java.lang.StringBuilder ! ("Изменяемая последовательность символов".)

Как Вы упомянутый, все те конкатенации строк создают Строки на всем протяжении. StringBuilder не сделает этого.

, Почему StringBuilder вместо StringBuffer ? От StringBuilder javadoc:

, Где возможно, рекомендуется, чтобы этот класс использовался в предпочтении к StringBuffer, поскольку это будет быстрее являться объектом большинства реализаций.

36
задан Jonathan Feinberg 3 December 2009 в 17:09
поделиться

3 ответа

в ваших столбцах могут быть NULL, если столбцы не указаны NOT NULL. Однако вы сможете сохранить только один экземпляр NULL (два набора одинаковых столбцов не будут разрешены, если все столбцы не имеют NULL):

SQL> CREATE TABLE t (id1 NUMBER, id2 NUMBER);

Table created
SQL> ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);

Table altered
SQL> INSERT INTO t VALUES (1, NULL);

1 row inserted
SQL> INSERT INTO t VALUES (1, NULL);

INSERT INTO t VALUES (1, NULL)

ORA-00001: unique constraint (VNZ.U_T) violated

SQL> /* you can insert two sets of NULL, NULL however */
SQL> INSERT INTO t VALUES (NULL, NULL);

1 row inserted
SQL> INSERT INTO t VALUES (NULL, NULL);

1 row inserted
59
ответ дан 27 November 2019 в 05:49
поделиться

Да, Oracle позволяет ограничениям UNIQUE содержать столбцы с содержимым NULL, но ограничения PRIMARY KEY не могут содержать столбцы, содержащие значения NULL. (Отредактировано: было "... столбцы, допускающие значение NULL ...", но мой пример ниже показывает, что это не так. Столбцы в PK могут быть определены как допускающие значение NULL, но не могут содержать NULL.)

У вас не может быть UNIQUE ограничение и ограничение PRIMARY KEY с теми же столбцами.

SQL> create table stest (col1 integer not null, col2 integer null);

Table created.

SQL> alter table stest add constraint stest_uq unique (col1, col2);

Table altered.

SQL> insert into stest values (1, 3);

1 row created.

SQL> insert into stest values (1, null);

1 row created.

SQL> insert into stest values (1, null);
insert into stest values (1, null)
*
ERROR at line 1:
ORA-00001: unique constraint (SUSAN_INT.STEST_UQ) violated

SQL> insert into stest values (2, null);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from stest;

      COL1       COL2
---------- ----------
         1          3
         1
         2

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2)
                                                             *
ERROR at line 1:
ORA-01449: column contains NULL values; cannot alter to NOT NULL

SQL> truncate table stest;

Table truncated.

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2)
                                          *
ERROR at line 1:
ORA-02261: such unique or primary key already exists in the table

SQL> alter table stest drop constraint stest_uq;

Table altered.

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);

Table altered.
5
ответ дан 27 November 2019 в 05:49
поделиться

Два значения NULL считаются в Oracle не равными, поэтому в этих столбцах могут быть значения NULL.

3
ответ дан 27 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: