未将值插入正确的记录/s MySQL
将值插入表中时,它不是将值分配给单个记录,而是将值分配给所有记录:未将值插入正确的记录/s MySQL,mysql,sql,Mysql,Sql,将值插入表中时,它不是将值分配给单个记录,而是将值分配给所有记录: CREATE TABLE IF NOT EXISTS user ( userID VARCHAR(50) NOT NULL, userName VARCHAR(40) NOT NULL, PRIMARY KEY (userID) ); CREATE TABLE IF NOT EXISTS rewards ( rewardID VARCHAR(5) NOT NULL,
CREATE TABLE IF NOT EXISTS user
(
userID VARCHAR(50) NOT NULL,
userName VARCHAR(40) NOT NULL,
PRIMARY KEY (userID)
);
CREATE TABLE IF NOT EXISTS rewards
(
rewardID VARCHAR(5) NOT NULL,
rewardDescription VARCHAR(20) NOT NULL,
PRIMARY KEY (rewardID)
);
CREATE TABLE IF NOT EXISTS promos
(
issueDate DATETIME DEFAULT CURRENT_TIMESTAMP,
expiryDateOfReward DATETIME GENERATED ALWAYS AS(issueDate + INTERVAL 6 MONTH),
quantity BIT DEFAULT 0,
userID VARCHAR(50) REFERENCES user(userID),
rewardID VARCHAR(5) REFERENCES rewards(rewardsID),
PRIMARY KEY(userID, rewardID)
);
INSERT INTO user
VALUES('DV2015', 'Bob'),
('DV2016', 'Mary'),
('DV2017', 'Megan');
INSERT INTO rewards
VALUES('rw10', '10% Off'),
('rw20', '20% Off'),
('rw30', '30% Off');
INSERT INTO promos (issueDate, quantity, userID, rewardID)
VALUES(DEFAULT, DEFAULT, 'DV2016', 'rw10'),
(DEFAULT, 1, 'DV2015', 'rw20'),
(DEFAULT, DEFAULT, 'DV2017', 'rw30');
然后我选择它:
SELECT userName,
rewards.rewardID,
rewards.rewardDescription,
promos.quantity
FROM user
JOIN promos
ON user.userID = promos.userID
JOIN rewards
ON promos.rewardID = promos.rewardID
WHERE user.userID = 'DV2015';
我不知道错误是在创建表、插入记录还是在select语句中。
这就是它的输出方式:
我只希望用户ID为“DV2015”的Bob在“rw20”上的“数量”为1。rw10和rw30的数量必须仍然为0。然而,当插入数据时,它会给他所有的奖励您错误地将数据插入表中
insert into table_name values()//if you provide values all the column
否则
insert into table_name (col1,col2...coln) values('use1','use2'....n)
因此,在您的情况下,用户表中的值将如下所示插入
INSERT INTO user values(1,'user_name1'),(2,'user_name2');
其他两个表(奖励、促销)数据插入过程有效您在此处意外交叉连接:
JOIN rewards
ON promos.rewardID = promos.rewardID
这当然适用于所有促销记录。你可能是说:
JOIN rewards
ON rewards.rewardID = promos.rewardID
如果您希望“rw10和rw30的数量必须仍然为0”,则应切换到
左连接
,而不是从促销表中切换到(内部)连接
连接
SELECT u.userName,
r.rewardID,
r.rewardDescription,
p.quantity
FROM promos p
JOIN user u ON u.userID = p.userID
JOIN rewards r ON r.rewardID = p.rewardID
WHERE u.userID = 'DV2015';
从你的预期结果来看,你可以试试这个
用户交叉连接
和奖励
笛卡尔产品结果表
然后promos
表外部连接
基于交叉连接
结果集
CREATE TABLE user
(
userID VARCHAR(50) NOT NULL,
userName VARCHAR(40) NOT NULL
);
CREATE TABLE rewards
(
rewardID VARCHAR(5) NOT NULL,
rewardDescription VARCHAR(20) NOT NULL
);
CREATE TABLE promos
(
issueDate DATETIME DEFAULT CURRENT_TIMESTAMP,
expiryDateOfReward DATETIME ,
quantity int DEFAULT 0,
userID VARCHAR(50),
rewardID VARCHAR(5)
);
INSERT INTO user
VALUES('DV2015', 'Bob'),
('DV2016', 'Mary'),
('DV2017', 'Megan');
INSERT INTO rewards
VALUES('rw10', '10% Off'),
('rw20', '20% Off'),
('rw30', '30% Off');
INSERT INTO promos (issueDate, quantity, userID, rewardID)
VALUES(0, 0, 'DV2016', 'rw10'),
(0, 1, 'DV2015', 'rw20'),
(0, 0, 'DV2017', 'rw30');
查询1:
SELECT userName,
r.rewardID,
r.rewardDescription,
coalesce(p.quantity,0) quantity
FROM user u CROSS JOIN rewards r
LEFT JOIN promos p
ON u.userID = p.userID and r.rewardID = p.rewardID
WHERE u.userID = 'DV2015'
| userName | rewardID | rewardDescription | quantity |
|----------|----------|-------------------|----------|
| Bob | rw20 | 20% Off | 1 |
| Bob | rw10 | 10% Off | 0 |
| Bob | rw30 | 30% Off | 0 |
:
SELECT userName,
r.rewardID,
r.rewardDescription,
coalesce(p.quantity,0) quantity
FROM user u CROSS JOIN rewards r
LEFT JOIN promos p
ON u.userID = p.userID and r.rewardID = p.rewardID
WHERE u.userID = 'DV2015'
| userName | rewardID | rewardDescription | quantity |
|----------|----------|-------------------|----------|
| Bob | rw20 | 20% Off | 1 |
| Bob | rw10 | 10% Off | 0 |
| Bob | rw30 | 30% Off | 0 |
如果您将rewards上的条件更改为
。rewardID=promos。rewardID
只会返回一条记录(即使您使用外部联接),则需要在用户
和奖励
表上使用交叉联接
@很抱歉,我忘了删除其他插入值。我删除了那些额外的条目