SQL – Drop constraint without specifying its name

Drop a UNIQUE constraint in relational databases like Oracle without specifying its name by referencing the column or columns:

ALTER TABLE Employee DROP UNIQUE (name)

.

But if you want to drop a NOT NULL constraint  without specifying its name you have to use a workaround, if there is an index on the column:

ALTER TABLE Employee ADD (name_ varchar(32));
update Employee set name_ = name;
ALTER TABLE Employee DROP COLUMN name;
ALTER TABLE Employee ADD (name varchar(32));
update Employee set name = name_;
ALTER TABLE Employee DROP COLUMN name_;

.

To drop a NOT NULL constraint in Oracle you can MODIFY an unindexed column:

ALTER TABLE Employee MODIFY name NULL;

.

ps. Dieses Mal ein How-To-Posting aus meinem spannenden Leben als Software-Entwicklerin in Englisch, zum leichteren Wiederfinden in Suchmaschinen.

Advertisements

oracle group concat

oft habe ich mir schon die frage gestellt, wie der einfachste weg ist, mehrere strings, die aus einem SQL statement in mehreren rows kommen, zu einem string in einer row zusammenzufassen. im mysql gibt es die funktion group_concat(), die in oracle aber leider nicht vorkommt.

das problem im detail ist, dass das statement für ein dataset:

select
   'A' as text
from
   dual
union
select
   'B' as text
from
   dual

folgendes liefert:

text

A
B

…, man aber manchmal den text in einem einzigen string in einer row und nicht in mehreren rows zurückbekommen will, also “A B”

die lösung dafür ist entweder mit plsql prozeduren zu arbeiten (was ich bis jetzt immer gemacht habe) oder auf hierarchische statements zurückzugreifen. folgendes knappes statement liefert die lösung

select
   ltrim(max(sys_connect_by_path(text, ' ')), ' ')
from
(
   select
      text,
      rownum as rn
   from
   (
      // dataset, z.b. siehe oben
   )
)
start with rn = 1
connect by prior rn=rn-1

eine etwas komplexere lösung ist im tom kyte blog zu finden