Avatar billede speedpete Nybegynder
20. august 2007 - 13:07 Der er 13 kommentarer og
1 løsning

Constraint: Kun én forekomst af bestemt værdi for hver

Kan man lave en constraint på en tabel:

"For hver "RegnskabID" må kun findes én 'RettighedID=2' "?

(2 betyder administrator - der må kun være én administrator pr. regnskab. Men for hver "RegnskabID" må der gerne være mange 'RettighedID' som ikke er lig 2)
Avatar billede arne_v Ekspert
21. august 2007 - 02:32 #1
Jeg tror at du skal lave det enten i applikationen eller med triggers.
Avatar billede speedpete Nybegynder
21. august 2007 - 08:09 #2
triggers er?
Avatar billede speedpete Nybegynder
21. august 2007 - 08:56 #3
... nå ja, det kan jeg jo google mig til (en slags eventhandler som man kan tilknytte en tabel, til at håndtere INSERT, UPDATE, DELETE).

Har du så et forslag til, hvordan den givne trigger skulle se ud? De eksempler jeg har fundet laver alle en insert i en anden tabel eller tæller en variabel op. Det er jo ikke det, jeg skal bruge. Tænker mig, at den skal tjekke på antallet af administratorer, og så evt. afvise INSERTen eller UPDATEn eller DELETEn.
Avatar billede arne_v Ekspert
21. august 2007 - 12:44 #4
Bemaerk at triggers kraever en meget ny MySQL version.
Avatar billede arne_v Ekspert
21. august 2007 - 12:49 #5
Logikken skal vaere:

insert trigger checker om det er en admin og om der allerede er en admin

update trigger checker om det er en admin og om der allerede er en admin
Avatar billede speedpete Nybegynder
21. august 2007 - 13:49 #6
Jeg har MySQL 6.0... der findes vist ikke nyere.
Jeg har nok brug for en stump rigtig SQL

Ved du så noget andet(?): Kan man ikke lave følgende med MySQL (Jeg vil tjekke, om den konto, jeg forsøger at indsætte, har et datointerval som overlapper med i forvejen eksisterende konti, og i så fald ikke indsætte den) :

IF not exists (SELECT <konti med overlappende gyldighedsinterval>)
THEN
INSERT INTO tabel values (<konto med gyldighedinterval>) END IF

Jeg kan ikke få det til at virke - måske SKAL det være i en stored procedure, eller har jeg fejl i syntaksen, eller hvad? Jeg googler og googler men kan ikke finde nogen løsning.
Avatar billede arne_v Ekspert
22. august 2007 - 03:08 #7
Du kan indsætte via en SP, men jeg ville også bruge en TRIGGER til det.
Avatar billede arne_v Ekspert
22. august 2007 - 04:01 #8
Et simpelt eksempel:

CREATE TABLE trigtest (i INTEGER NOT NULL PRIMARY KEY);
DELIMITER |
CREATE TRIGGER trigtest_insert BEFORE INSERT ON trigtest
  FOR EACH ROW BEGIN
    IF NEW.i > 10 THEN
      CALL OOOPS(); -- should be RETURN FALSE; or RAISEERROR; but MySQL 5.0 does not support that
    END IF;
  END;
|
DELIMITER ;
INSERT INTO trigtest VALUES (1);
INSERT INTO trigtest VALUES (10);
INSERT INTO trigtest VALUES (100);
DROP TRIGGER trigtest_insert;
DROP TABLE trigtest;

(det kan efter sigende laves pænere i 6.0)
Avatar billede speedpete Nybegynder
22. august 2007 - 08:43 #9
Ok, tak for det. Det vil jeg lige kigge på. Hvordan ser det ud med race-conditions og triggers? Jeg tænker på: Først spørger jeg, om min betingelse for at UPDATE er opfyldt, og får positivt svar. Så, i splitsekundet inden jeg når at UPDATE, kommer en anden bruger med sin UPDATE, og betingelsen for min UPDATE er faldet til jorden.
Avatar billede speedpete Nybegynder
22. august 2007 - 10:27 #10
Smid lige et svar, så får du pointsne. Læs videre her:
http://www.eksperten.dk/spm/792835
Avatar billede arne_v Ekspert
23. august 2007 - 01:19 #11
svar
Avatar billede arne_v Ekspert
23. august 2007 - 01:40 #12
Jeg kan ikke finde noget doc på triggers og concurrency.

Så det er et meget godt spørgsmål.

Du kunne prøve at spørge i MySQL forum.
Avatar billede speedpete Nybegynder
23. august 2007 - 08:59 #13
Ja, det vil jeg prøve. Tak igen.
Avatar billede speedpete Nybegynder
23. august 2007 - 10:33 #14
Jeg har oprettet et spørgsmål om concurrency:

http://forums.mysql.com/read.php?99,169016,169016#msg-169016
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester