通过 MySQL 中的循环将 1NF 数据插入 Table
Inserting 1NF Data into Table through a Loop in MySQL
如何将多行数据插入 table 以保持 1NF?现在我有一个 html 表单,可以创建一个群组,您可以在其中 add/invite 群组成员加入。您可以 add/invite 多个或一个:组成员的输入可能因用户而异。我想获取用户输入并将其添加到维护 1NF 的 table 中。我正在考虑在 MySQL 中创建一个存储过程,并在我拥有值列表并进行 'i' 插入调用后调用它(我是用户邀请的成员数)。
我的 App.route 用于创建团队:现在我正在将数据插入 tb_team table,接下来我要填充 team_members table与用户和关联 team_id
@app.route('/create-team/', methods=['GET', 'POST'])
@login_required
def create_team():
msg = ''
if request.method == 'POST':
# Create variables for easy access
team_name = request.form['team_name']
invite = request.form['invite']
team_desc = request.form['content']
if not team_name:
msg='Please enter a group name'
return render_template('create_team.html', msg=msg, team_name=team_name, invite=invite, content=team_desc)
if not invite:
msg = 'Please invite users to the team'
return render_template('create_team.html', msg=msg, team_name=team_name, invite=invite, content=team_desc)
if not invite and not team_name:
msg = 'Please fill out the form'
return render_template('create_team.html', msg=msg)
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
cursor.execute('SELECT user_id from tb_user WHERE user_name = %s', (invite,))
invite_id = cursor.fetchone()
invite_id_final = invite_id['user_id']
# Check if team_name exists in tb_team table
cursor.execute('SELECT * FROM tb_team WHERE team_name = %s', (team_name,))
name = cursor.fetchone()
# If team_name currently exists, show error that it is taken
if name:
msg = 'This Project Name is already taken!'
return render_template('create_team.html', msg=msg, team_name=team_name, invite=invite, content=team_desc)
else:
msg = 'You have successfully created a team!'
cursor.execute("INSERT INTO tb_team (team_name)"
" VALUES (%s)", (team_name))
mysql.connection.commit()
return redirect(url_for('team_page', group_name=team_name))
return render_template('create_team.html')
这是我的数据库设计以及我最终想要实现的目标:
这里有虚拟数据:
编写存储过程是否是插入这些组成员的正确方法?
将要添加的用户列表传递到一个字符串变量中,将其放入一个 while 循环,获取每个用逗号分隔的用户,并将其添加到 table 中,直到字符串中不再存在用户为止多变的? (请参阅下面有关我的存储过程的代码)
DELIMITER
CREATE PROCEDURE basicInsert()
BEGIN
SET @myArrayOfUsers = '100,102,105,'
WHILE(LOCATE(',', @myArrayOfUsers) > 0) DO
SET @value = ELT(1, @myArrayOfUsers);
SET @myArrayOfUsers= SUBSTRING(@myArrayOfUsers, LOCATE(',',@myArrayOfUsers) + 1);
INSERT INTO `group_member` VALUES(1001, @value);
END WHILE;
END;
DELIMITER ;
CALL basicInsert();
谢谢!非常感谢所有帮助!
您的程序存在一些重大问题。
ELT 不会回馈你想要的东西。它实际上 returns 完整的@myArrayOfUsers
在没有临时表的情况下调试 LOOP 很棘手,但是当您不确定代码的结果是什么时,请暂时删除循环添加更多@用户变量并逐行调试
DROP procedure IF EXISTS `basicInsert`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `basicInsert`()
BEGIN
SET @myArrayOfUsers = '100,102,105';
#SET @myArrayOfUsers = '106,107,108,';
WHILE(LOCATE(',', @myArrayOfUsers) > 0) DO
SET @value = SUBSTRING_INDEX(@myArrayOfUsers,',',1);
IF (LENGTH(@myArrayOfUsers) > LENGTH(@value) +2) THEN
SET @myArrayOfUsers= SUBSTRING(@myArrayOfUsers, LENGTH(@value) + 2);
INSERT INTO `group_member` VALUES(1001, @value);
ELSE
INSERT INTO `group_member` VALUES(1001, @value);
-- to end while loop
SET @myArrayOfUsers= '';
END IF;
IF LENGTH(@myArrayOfUsers) > 0 AND LOCATE(',', @myArrayOfUsers) = 0 then
-- Last entry was withóut comma
INSERT INTO `group_member` VALUES(1001, @myArrayOfUsers);
END IF;
END WHILE;
END$$
DELIMITER ;
我进行了测试,您也看到了末尾没有逗号的情况。
因为您只想执行 !NF,所以我不检查已经存在的条目
如何将多行数据插入 table 以保持 1NF?现在我有一个 html 表单,可以创建一个群组,您可以在其中 add/invite 群组成员加入。您可以 add/invite 多个或一个:组成员的输入可能因用户而异。我想获取用户输入并将其添加到维护 1NF 的 table 中。我正在考虑在 MySQL 中创建一个存储过程,并在我拥有值列表并进行 'i' 插入调用后调用它(我是用户邀请的成员数)。
我的 App.route 用于创建团队:现在我正在将数据插入 tb_team table,接下来我要填充 team_members table与用户和关联 team_id
@app.route('/create-team/', methods=['GET', 'POST'])
@login_required
def create_team():
msg = ''
if request.method == 'POST':
# Create variables for easy access
team_name = request.form['team_name']
invite = request.form['invite']
team_desc = request.form['content']
if not team_name:
msg='Please enter a group name'
return render_template('create_team.html', msg=msg, team_name=team_name, invite=invite, content=team_desc)
if not invite:
msg = 'Please invite users to the team'
return render_template('create_team.html', msg=msg, team_name=team_name, invite=invite, content=team_desc)
if not invite and not team_name:
msg = 'Please fill out the form'
return render_template('create_team.html', msg=msg)
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
cursor.execute('SELECT user_id from tb_user WHERE user_name = %s', (invite,))
invite_id = cursor.fetchone()
invite_id_final = invite_id['user_id']
# Check if team_name exists in tb_team table
cursor.execute('SELECT * FROM tb_team WHERE team_name = %s', (team_name,))
name = cursor.fetchone()
# If team_name currently exists, show error that it is taken
if name:
msg = 'This Project Name is already taken!'
return render_template('create_team.html', msg=msg, team_name=team_name, invite=invite, content=team_desc)
else:
msg = 'You have successfully created a team!'
cursor.execute("INSERT INTO tb_team (team_name)"
" VALUES (%s)", (team_name))
mysql.connection.commit()
return redirect(url_for('team_page', group_name=team_name))
return render_template('create_team.html')
这是我的数据库设计以及我最终想要实现的目标:
这里有虚拟数据:
编写存储过程是否是插入这些组成员的正确方法?
将要添加的用户列表传递到一个字符串变量中,将其放入一个 while 循环,获取每个用逗号分隔的用户,并将其添加到 table 中,直到字符串中不再存在用户为止多变的? (请参阅下面有关我的存储过程的代码)
DELIMITER
CREATE PROCEDURE basicInsert()
BEGIN
SET @myArrayOfUsers = '100,102,105,'
WHILE(LOCATE(',', @myArrayOfUsers) > 0) DO
SET @value = ELT(1, @myArrayOfUsers);
SET @myArrayOfUsers= SUBSTRING(@myArrayOfUsers, LOCATE(',',@myArrayOfUsers) + 1);
INSERT INTO `group_member` VALUES(1001, @value);
END WHILE;
END;
DELIMITER ;
CALL basicInsert();
谢谢!非常感谢所有帮助!
您的程序存在一些重大问题。
ELT 不会回馈你想要的东西。它实际上 returns 完整的@myArrayOfUsers
在没有临时表的情况下调试 LOOP 很棘手,但是当您不确定代码的结果是什么时,请暂时删除循环添加更多@用户变量并逐行调试
DROP procedure IF EXISTS `basicInsert`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `basicInsert`()
BEGIN
SET @myArrayOfUsers = '100,102,105';
#SET @myArrayOfUsers = '106,107,108,';
WHILE(LOCATE(',', @myArrayOfUsers) > 0) DO
SET @value = SUBSTRING_INDEX(@myArrayOfUsers,',',1);
IF (LENGTH(@myArrayOfUsers) > LENGTH(@value) +2) THEN
SET @myArrayOfUsers= SUBSTRING(@myArrayOfUsers, LENGTH(@value) + 2);
INSERT INTO `group_member` VALUES(1001, @value);
ELSE
INSERT INTO `group_member` VALUES(1001, @value);
-- to end while loop
SET @myArrayOfUsers= '';
END IF;
IF LENGTH(@myArrayOfUsers) > 0 AND LOCATE(',', @myArrayOfUsers) = 0 then
-- Last entry was withóut comma
INSERT INTO `group_member` VALUES(1001, @myArrayOfUsers);
END IF;
END WHILE;
END$$
DELIMITER ;
我进行了测试,您也看到了末尾没有逗号的情况。
因为您只想执行 !NF,所以我不检查已经存在的条目