[Oracle] Drop primary key probleem

Pagina: 1
Acties:
  • 175 views sinds 30-01-2008
  • Reageer

  • mdcroon
  • Registratie: Januari 2005
  • Laatst online: 27-01 13:05
Ik krijg een raar probleem met het droppen en opnieuw aanmaken van een primary key. Volgens onderstaand script maak ik een primary key aan op een bestaande tabel:

code:
1
2
3
ALTER TABLE uclass
ADD CONSTRAINT pk_uclass
PRIMARY KEY (class_id);


Vervolgens drop ik de primary key:

code:
1
ALTER TABLE uclass DROP CONSTRAINT pk_uclass;


Ik maak opnieuw een primary key aan:

code:
1
2
3
ALTER TABLE uclass
ADD CONSTRAINT pk_uclass
PRIMARY KEY (class_id);


Op dit moment krijg ik de melding "name is already used by an existing object". Voer ik een select uit op de all_indexes tabel dan zie ik inderdaad nog een record staan. Ik kan nu dus geen nieuwe primary key aanmaken.

Kan iemand dit gedrag verklaren en hoe ik het probleem moet oplossen?

Het gaat om Oracle versie 10g.

[ Voor 2% gewijzigd door mdcroon op 27-06-2007 10:51 . Reden: Oracle versie toegevoegd ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Commit je je changes wel ?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:59
Krijg je bij het droppen van de primairy key ook geen warning of iets dergelijks? Want blijkbaar wordt de key gewoon niet gedropped. En dit kan natuurlijk verschillende oorzaken hebben.

  • mdcroon
  • Registratie: Januari 2005
  • Laatst online: 27-01 13:05
Ja, tussentijds wordt inderdaad een commit uitgevoerd.

  • mdcroon
  • Registratie: Januari 2005
  • Laatst online: 27-01 13:05
Marcj schreef op woensdag 27 juni 2007 @ 10:52:
Krijg je bij het droppen van de primairy key ook geen warning of iets dergelijks?
De melding die ik krijg is "Table altered"

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als dit de exacte statements die je gebruikt hebt zijn, dan zou het moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SQL> create table uclass (class_id number);

Table created.

SQL> ALTER TABLE uclass
  2  ADD CONSTRAINT pk_uclass
  3  PRIMARY KEY (class_id);

Table altered.

SQL> ALTER TABLE uclass DROP CONSTRAINT pk_uclass;

Table altered.

SQL> ALTER TABLE uclass
  2  ADD CONSTRAINT pk_uclass
  3  PRIMARY KEY (class_id);

Table altered.

Als de pk gemaakt is met een 'using index' clausule dan zijn de constraint en index ontkoppeld en zul je hem ook weer met een 'using index' aan moeten maken.

Who is John Galt?


  • mdcroon
  • Registratie: Januari 2005
  • Laatst online: 27-01 13:05
Het is opgelost maar begrijpen doe ik het nog niet.

De tabel is aangemaakt in tablespace x. De primary key stond in tablespace y. Blijkbaar blijft de primary key bestaan indien deze in een andere tablespace zit.

Wat ik nu heb gedaan is de tabel gedropt. Vervolgens heb ik de tabel en de primary key opnieuw aangemaakt in dezelfde tablespace. Nu werkt het wel.

  • Exocet
  • Registratie: Januari 2001
  • Niet online
mdcroon schreef op woensdag 27 juni 2007 @ 10:52:
Ja, tussentijds wordt inderdaad een commit uitgevoerd.
Commit tijdens DDL uitvoeren heeft geen zin.

Ik denk dat de melding komt omdat er nog een index bestaat met dezelfde naam, het lijkt erop dat de contraint wel gedropt is, maar de index niet. (bij het maken van een primary key wordt er altijd een index met dezelfde naam aangemaakt).
Wel vreemd, want bij een simpele test waar ik hetzelfde doe (ook 10g), wordt de primary key wel netjes gedropt en opnieuw aangemaakt.

In jouw situatie gaat het goed na het droppen van de tabel, omdat je hiermee ook de index hebt verwijderd.

[ Voor 8% gewijzigd door Exocet op 28-06-2007 08:55 ]


  • mdcroon
  • Registratie: Januari 2005
  • Laatst online: 27-01 13:05
Exocet schreef op donderdag 28 juni 2007 @ 08:55:
[...]
Commit tijdens DDL uitvoeren heeft geen zin.
Ik weet dat een commit geen zin heeft in deze situaties maar op een gegeven moment begin je aan jezelf te twijfelen. Volgens mij gaat het fout omdat de tabel en constraint in twee verschillende table spaces staan.

Na het droppen van de tabel heb ik deze opnieuw aangemaakt en gecontroleerd dat de constraint in dezelfde table space staat. Vervolgens lukt het wel om de constraint te droppen en opnieuw aan te maken.

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 23:20

JaQ

mdcroon schreef op donderdag 28 juni 2007 @ 11:01:
[...]


Ik weet dat een commit geen zin heeft in deze situaties maar op een gegeven moment begin je aan jezelf te twijfelen. Volgens mij gaat het fout omdat de tabel en constraint in twee verschillende table spaces staan.

Na het droppen van de tabel heb ik deze opnieuw aangemaakt en gecontroleerd dat de constraint in dezelfde table space staat. Vervolgens lukt het wel om de constraint te droppen en opnieuw aan te maken.
Constraints staan niet in tablespaces, een constraint is immers geen object maar een attribuut van een object (in dit geval een tabel).

De bijbehorende unieke index die aangemaakt wordt staat wel in een tablespace. Als je nog geen unieke index op de primary key kolom hebt aangemaakt, zal Oracle een indexnaam voor je bedenken (SYS$.....) Deze index wordt niet gedropped op het moment dat je de constraint verwijderd. Echter indexes zitten in een andere namespace en je mag dezelfde naam voor een index als voor een constraint gebruiken.

Ik denk dus dat je ergens anders iets gemist hebt, de door jou beschreven werkwijze is volledig valide.

Egoist: A person of low taste, more interested in themselves than in me

Pagina: 1