好吧,老实说,我投票决定关闭,因为你这样做的方式只是灾难的根源。您不能继续为每所学校创建一个新数据库。您真正不应该做的是使用已弃用的扩展。你问的问题也很相似:“嘿,我已经让被定罪的恋童癖者在托儿所工作,但是有投诉......我应该如何处理他们?” . 唯一正确的答案是不要做你正在做的事情。
开始:您假设人们会很好地在表单中输入有效的数据库名称......他们可以利用该表单并输入如下内容:
tbl`(
id INT AUTO_INCREMENT PRIMARY KEY,
field_name1 VARCHAR(255) NOT NULL PRIMARY KEY, -- normal fields
field_name2 INTEGER(11) NOT NULL PRIMARY KEY,
field_name3 VARCHAR(255) NOT NULL DEFAULT '',
inserted TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP NOT NULL DEFAULT 0
ON UPDATE CURRENT_TIMESTAMP
)ENGINE = INNODB
CHARACTER SET utf8 COLLATE utf8_general_ci; --
这是有效的 SQL,但会弄乱您的查询。不过,这假设用户知道注射。即使他们不这样做,是什么让您认为任何学校名称都是有效的数据库名称?假设有一所学校,例如“麻木头颅研究所”,或者是非虚构的:“麻省理工学院”。当然,这不能用作数据库名称!
你应该做的是有一个简单的表,叫做学校,看起来像这样:
+----------+----------+
| id | name |
+----------+----------+
| 12 | foobar |
| 15 | M.I.T. |
+----------+----------+
现在每所学校都有自己的唯一 ID,在所有其他表中,例如学生登录,添加一个字段school_id
:
//tbl student_login
+--------------------+--------------------+--------------------+--------------------+
| id | school_id | login | passw |
+--------------------+--------------------+--------------------+--------------------+
| 1 | 12 | Bobby | hash |
| 2 | 15 | Bobby | hash |
+--------------------+--------------------+--------------------+--------------------+
现在每个学生的每条记录都与正确的学校相关联。更重要的是,您现在可以使用数据库提供的所有好东西,例如外键、存储过程、视图以及您拥有的... 使表具有关系!
如果您想获取foobar学生的所有学生登录信息: 简单:
SELECT students.login FROM schools
LEFT JOIN studend_login AS students
ON schools.id = studends.school_id
WHERE schools.name = 'foobar';
您可以为每所学校创建一个视图,这样您就不必一遍又一遍地编写相同的连接,如果您真的想要......
如果学校碰巧关闭/不再需要您的服务,只需删除它来自schools
表,并且由于一些巧妙放置的外键,您可以设置您的表,以便链接回该学校的其他表中的所有记录也被删除或更新(软删除)。
“关系设计mysql”的快速谷歌,把我带到这里,我没有通读它,但图表确实显示了关系设计的内容:更多的表,包含更少的数据,但具有适当的索引和键