完全是 mySQL 触发幸福问题

Totally a mySQL trigger happiness issue

所以我创建了我的 lil 数据库,然后使用它。我添加了两个 tables,现在我想做的就是:当一个用户被插入到 USERS table 中时,也将一些默认信息插入到对应的 USER_ACCOUNT table 中给新插入的用户。显然我做错了什么,但我不知道是什么......提前致谢。 =)

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; //

没有看到错误消息,我只是猜测,但我怀疑您不满足 FK 约束是罪魁祸首。您的触发代码可能应该是

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 ;

USER_ACCOUNT.OwnerUserID 设置为刚刚插入的 USERS.UserID 的值。

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 ;  

备注

  • 请注意 primary keysdatatype 中的变化,是的,如果您希望 large 系统内的缩放数据将适合 initial setup
  • USER_ACCOUNTtable的foreign key部分也有变化,应该符合reference table's column的相关键值,也应该cascade对于任何更改
  • UserAccountBalence 更改为 UserAccountBalance,还更改了 datatype 以容纳将保存在上述列中的 currency value
  • 关于 USERS table 中的 UserEmail 列,从 30 更改为 50,您需要给应用程序一些喘息的空间万一validation突然失败
  • 更新了触发区域以保存您将在 foreign key
  • 中使用的 key