完全是 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 keys
的 datatype
中的变化,是的,如果您希望 large
系统内的缩放数据将适合 initial setup
你
- 你
USER_ACCOUNT
table的foreign key
部分也有变化,应该符合reference table's column
的相关键值,也应该cascade
对于任何更改
- 将
UserAccountBalence
更改为 UserAccountBalance
,还更改了 datatype
以容纳将保存在上述列中的 currency value
- 关于
USERS
table 中的 UserEmail
列,从 30
更改为 50
,您需要给应用程序一些喘息的空间万一validation
突然失败
- 更新了触发区域以保存您将在
foreign key
中使用的 key
所以我创建了我的 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 keys
的datatype
中的变化,是的,如果您希望large
系统内的缩放数据将适合initial setup
你 - 你
USER_ACCOUNT
table的foreign key
部分也有变化,应该符合reference table's column
的相关键值,也应该cascade
对于任何更改 - 将
UserAccountBalence
更改为UserAccountBalance
,还更改了datatype
以容纳将保存在上述列中的currency value
- 关于
USERS
table 中的UserEmail
列,从30
更改为50
,您需要给应用程序一些喘息的空间万一validation
突然失败 - 更新了触发区域以保存您将在
foreign key
中使用的
key