我是mySQL的初学者,我正在尝试使用有关用户的信息创建用户表(请参见代码),并在列中填充我从创建的新表中获得的详细信息。
现在,我希望能够将“信用卡”表中的一些信息(例如数字)放到包含“信用卡”列的“用户”表中,以便我可以看到每个用户的信用卡号。 / p>
我还将用户名与信用卡所有者的名字进行比较,以便它根据用户填充表格。
我在这里找不到有关特定问题的任何信息。 这是我要写的方法:
con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
if (err) {
console.error(err);
} else {
const JoinCreditCard = 'INSERT INTO users (creditcard) SELECT number,name FROM creditcards WHERE users.name = creditcards.name';
const userCreateModel = `
CREATE TABLE IF NOT EXISTS users (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(45) NOT NULL,
username VARCHAR(45) NOT NULL,
email VARCHAR(45) NOT NULL,
phonenumber VARCHAR(45) NOT NULL,
password VARCHAR(255) NOT NULL,
creditcard INT(11),
salt VARCHAR(255),
created_at DATE,
update_at DATE,
deleted_at DATE,
lastSignIn DATE,
PRIMARY key (id)
)
`;
const CreditCardModel = `
CREATE TABLE IF NOT EXISTS creditcards (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR (25) NOT NULL,
type VARCHAR(10) NOT NULL,
number INT(12) NOT NULL,
expiration DATE,
svss INT(3) NOT NULL,
created_at DATE,
PRIMARY key (id)
)
`;
我正在尝试创建一个名为ula的用户,然后创建一个我从邮递员发送的,名为ula(以及所有其他列)的信用卡。 nodejs中的信用卡部分如下所示:
const createCreditCard = async (req, res, next) => {
const {
name,
type,
number,
expiration,
svss
}: {
name: String,
type: String,
number: String,
expiration: String,
svss: String
} = req.body;
const createAt = new Date(Date.now());
try {
const createNewCreditCard = 'INSERT INTO creditcards (name, type, number, expiration, svss) VALUES (?,?,?,?,?)';
con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
if (err) {
console.error(err);
} else {
const JoinCreditCard = 'UPDATE users SET creditcard=' + number + ' WHERE name="' + name + '"';
console.log(results);
}
});
res.status(201).send({ success: true, message: 'New credit card was created', data: {name, type, number, expiration, svss} });
} catch (error) {
res.status(500).send({ success: false, message: 'Server error' });
}
await next;
}
服务器返回201,我转到mysql,打开用户,请参阅creditcard列及其NULL
。
答案 0 :(得分:0)
重要的是,表格必须采用规范化形式。 应该有3张桌子。 用户-所有用户数据 信用卡-所有与信用卡有关的信息。 用户信用卡地图-将用户映射到信用卡信息。
答案 1 :(得分:0)
由于users
表的数据库中已经存在该条目,因此应使用UPDATE
而不是INSERT
。
一个适用于您的代码的示例(您已经将name
和number
称为var,因为您刚刚使用它们创建了信用卡信息,而无需再次选择它们):
con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
if (err) {
console.error(err);
} else {
const JoinCreditCard = 'UPDATE users SET creditcard=' + number + ' WHERE name="' + name + '"';
编辑:这是您所做修改的新代码。您已经使用了准备好的语句,所以请忘记我的通知。我已更新查询以遵循此要求。您的代码中缺少的是您实际上需要执行查询!只声明常量不会对数据库有任何作用。
try {
const createNewCreditCard = 'INSERT INTO creditcards (name, type, number, expiration, svss) VALUES (?,?,?,?,?)';
con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
if (err) {
console.error(err);
} else {
console.log(results);
const JoinCreditCard = 'UPDATE users SET creditcard=? WHERE name=?';
con.query(JoinCreditCard, [number, name], (err, results) => {
if (err) {
console.error(err);
} else {
console.log(results);
}
});
}
});
res.status(201).send({ success: true, message: 'New credit card was created', data: {name, type, number, expiration, svss} });
} catch (error) {
res.status(500).send({ success: false, message: 'Server error' });
}
注意:您应该知道,使用名称来引用信用卡将不会允许您为一个用户使用多张信用卡,并且应注意使用相同名称的用户,否则此查询将更新两个用户。始终使用id
子句中的用户WHERE
字段会更安全。 (您现在应该知道)
这是我的建议:
users
中的信用卡只存储信用卡表中的ID。这样,关系就位于主键上,并且关系得到了优化(您需要在信用卡创建请求后在下面的代码的内部SELECT
中获得ID)。使用ID标识行更新,以防止2位用户被更新
从信用卡表中删除name
,它已经在用户中
具有第三个表来引用诸如user1974729之类的关系不是强制性的,但是,如果您方便地希望每个用户拥有多于一张信用卡或多于一个用户,则情况会如此共享卡(1对n的关系)
代码:
//relation based on id instead of number stored in users + name removed. I assume at this point, you know the id of your user (in var "id" used below in `WHERE` clause)
con.query(createNewCreditCard, [type, number, expiration, svss], (err, results) => {
if (err) {
console.error(err);
} else {
const JoinCreditCard = 'UPDATE users SET creditcard=(SELECT id FROM creditcards WHERE type="' + type + '" AND number="' + number + '" AND expiration="' + expiration + '" AND svss="' + svss + '") WHERE id="' + id + '"';
//no change in userCreateModel
//deleted "name" in CreditCardModel
const CreditCardModel = `
CREATE TABLE IF NOT EXISTS creditcards (
id INT(11) NOT NULL AUTO_INCREMENT,
type VARCHAR(10) NOT NULL,
number INT(12) NOT NULL,
expiration DATE,
svss INT(3) NOT NULL,
created_at DATE,
PRIMARY key (id)
)
`;