Hallo Forum,
wie Tom vorgeschlagen hat, habe ich die Aufgabe mit einem Trigger gelöst.
Verbesserungsvorschläge sind erwünscht!
DROP TABLE IF EXISTS file;
CREATE TABLE file (
fileid INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
filename_upload varchar(255) NOT NULL COMMENT 'NTFS max. filename length=255 UTF8 chars',
filename_system varchar(255) NOT NULL COMMENT 'Konflikte mit filenames andere user vermeidenNOW()',
extid INT UNSIGNED,
frontuseid INT UNSIGNED,
userid INT UNSIGNED DEFAULT NULL,
betriebid INT UNSIGNED DEFAULT NULL,
unternid INT UNSIGNED DEFAULT NULL,
FOREIGN KEY (userid) REFERENCES user(userid)
) ENGINE = InnoDB;
DROP TRIGGER IF EXISTS files_insert_nur1PK_aus3PK;
DELIMITER $$
CREATE TRIGGER files_insert_nur1PK_aus3PK BEFORE INSERT ON file
FOR EACH ROW BEGIN
IF (NEW.userid IS NULL AND NEW.betriebid IS NULL AND NEW.unternid IS NULL) OR
(NEW.userid IS NULL AND NEW.betriebid>0 AND NEW.unternid>0) OR
(NEW.userid>0 AND NEW.betriebid IS NULL AND NEW.unternid>0) OR
(NEW.userid>0 AND NEW.betriebid>0 AND NEW.unternid IS NULL) OR
(NEW.userid>0 AND NEW.betriebid>0 AND NEW.unternid>0)
THEN
/* Fehlerbedingung=TRUE -> Fehler provozieren um weitere Abarbeitung zu verhindern */
INSERT INTO Es_darf_nur_1_aus_3_ID_FK_insertet_werden VALUES(NULL);
END IF;
END$$
DELIMITER ;
#Folgendes INSERT muss funktionieren
INSERT INTO file VALUES(DEFAULT,"filenameupload.dat","filenameupload.dat",1,1,DEFAULT,8,DEFAULT);
#Folgendes INSERT muss einen Fehler provozieren
INSERT INTO file VALUES(DEFAULT,"filenameupload.dat","filenameupload.dat",1,1,2,8,9);