2016-03-23 1 views
3

Donc je crée ma petite DB et ensuite j'utilise la chose. J'ajoute deux tables et maintenant tout ce que je veux faire est la suivante: lorsqu'un utilisateur est inséré dans la table USERS, insérez également des informations par défaut dans la table USER_ACCOUNT qui correspond à l'utilisateur nouvellement inséré. Clairement je fais quelque chose de mal mais je ne sais pas quoi ... Merci d'avance. =)Totalement un problème de bonheur déclencheur mySQL

CREATE DATABASE REST_PROJECT; 
USE REST_PROJECT; 

CREATE TABLE USERS (
    UserID    INT Primary Key AUTO_INCREMENT NOT NULL, 
    UserEmail   VARCHAR(30), 
    UserPassword  VARCHAR(30) 
); 

CREATE TABLE USER_ACCOUNT (
    UserAccountID   INT Primary Key AUTO_INCREMENT NOT NULL, 
    OwnerUserID   INT, 
    UserAccountName  VARCHAR(30), 
    UserAccountType  VARCHAR(10) NOT NULL, 
    UserAccountBalence INT, 
    FOREIGN KEY (OwnerUserID) REFERENCES USERS(UserID) 
); 

DELIMITER // 
CREATE TRIGGER makeDefaultUserAccount 
AFTER INSERT ON USERS 
For each row 
BEGIN 
    INSERT INTO USER_ACCOUNT 
    (UserAccountName, UserAccountType, UserAccountBalence) 
    values ('Default Account','default', 100); 
END; // 
+2

Alors, que se passe-t-il réellement lorsque vous exécutez ceci? –

Répondre

3
CREATE DATABASE REST_PROJECT; 
USE REST_PROJECT; 

CREATE TABLE `USERS` (
    UserID    BIGINT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    UserEmail   VARCHAR(50), 
    UserPassword  VARCHAR(30) 
); 

CREATE TABLE `USER_ACCOUNT` (
    UserAccountID   BIGINT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    UserID    BIGINT(20) UNSIGNED NOT NULL, 
    UserAccountName  VARCHAR(30), 
    UserAccountType  VARCHAR(10) NOT NULL, 
    UserAccountBalance DECIMAL(19,6), 
    CONSTRAINT `fk_USER_ACCOUNT_UserID` FOREIGN KEY (`UserID`) 
     REFERENCES `USERS`.`UserID` (`UserID`) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

DELIMITER // 
CREATE TRIGGER `makeDefaultUserAccount` 
AFTER INSERT ON `USERS` 
FOR EACH ROW BEGIN 
    INSERT INTO USER_ACCOUNT (OwnerUserID, UserAccountName, UserAccountType, UserAccountBalance) 
    VALUES (NEW.UserID, 'Default Account','default', 100); 
END// 
DELIMITER ; 

Remarques

  • Notez les changements dans la datatype du primary keys, oui, si vous vous attendez large données à l'échelle à l'intérieur de votre système qui serait le initial setup qui vous conviendra
  • changements également dans la partie foreign key de vous USER_ACCOUNT, devrait se conformer à la clé associée de reference table's column, et devrait également cascade pour tout change
  • Changé UserAccountBalence dans UserAccountBalance, et aussi le datatype pour accueillir le currency value qui sera enregistré dans ladite colonne
  • En ce qui concerne la colonne UserEmail dans votre table USERS, changé en 50 de 30, vous devez donner à l'application une bouffée d'oxygène Incase validation soudainement échoué
  • mis à jour la zone de déclenchement pour sauver aussi le key que vous utiliserez dans votre foreign key
+1

J'ai fait une petite modification à l'instruction CREATE TABLE 'USER_ACCOUNT': Au lieu de REFERENCES' USERS'.'UserID' ('UserID') J'ai utilisé REFERENCES' USERS' ('UserID') Et tout a totalement fonctionné. –

+0

bon à savoir, à votre santé – Avidos

0

Sans voir le message d'erreur que je ne devine, mais je pense que le fait que vous n'êtes pas satisfaisant la contrainte FK est à blâmer. Votre code de déclenchement devrait probablement être

DELIMITER // 
    CREATE TRIGGER makeDefaultUserAccount 
    AFTER INSERT ON USERS 
    For each row 
    BEGIN 
     INSERT INTO USER_ACCOUNT 
      (OwnerUserID, UserAccountName, UserAccountType, UserAccountBalence) 
     values (NEW.UserID, 'Default Account','default', 100); 
    END; // 
DELIMITER ; 

qui fixe USER_ACCOUNT.OwnerUserID à la valeur de USERS.UserID qui vient d'être inséré.