在不存在的MySQL中保存记录

时间:2019-01-01 12:04:09

标签: mysql sql database database-design

比方说,我有一个名为cities的预定义表格,其中包含我国几乎所有城市。

当用户注册自己(用户表)时,表cities_id中的列user存储表cities中的城市ID(外键,参考表城市),喜欢

CREATE TABLE `cities` (
    `id` int,
    `city_name` varchar(100)
)

CREATE TABLE `user` (
    `id` int,
    `name` varchar(60)
    `****`
    `cities_id` FK
)

用户表存储城市ID。

但是,如果我错过了几个城市,该怎么办...用户如何将其城市名称保存在用户表中,该表不接受任何城市名称,而仅接受ID。

city_name中的city_id之后是否可以再添加一列user,例如

CREATE TABLE `user` (
    `id` int,
    `name` varchar(60)
    `****`
    `cities_id` FK
    `citiy name` varchar(100)
)

记录用户在注册时输入的数据?能做到吗?

6 个答案:

答案 0 :(得分:6)

您可以在城市表标签中添加一个类型,用户找不到与其对应的城市,允许他键入其城市的名称,然后您在城市中,并将在表中创建一个对应的记录类型标记为特殊状态(方便操作人员检查和更正),同时将记录ID保存到用户记录中

CREATE TABLE `cities` (
    `id` int,
    `city_name` varchar(100),
    `type` int,
)

CREATE TABLE `user` (
    `id` int,
    `name` varchar(60)
    `****`
    `cities_id` FK
)

答案 1 :(得分:3)

正如@Joakim在评论中提到的那样,从数据库角度来看,因为citys_id是引用城市表的外键,所以如果表中还没有该城市,则在用户表中插入记录将失败。

从编程的角度来看,如果希望在用户注册时自动自动插入表中不存在的城市,则可以。假设您正在使用Java和Hibernate,并且User实体包含City实体,则在用户实体上调用saveOrUpdate()方法将导致插入城市记录(如果尚未插入),然后将用户记录插入到User表中。

答案 2 :(得分:3)

这就是我迅速解决此问题的方式

创建一个额外的表格来存储丢失的城市,该表格将由用户介绍

CREATE TABLE `cities_users` (
`id` int,
`city_name` varchar(100),
`added_by` varchar(100),
`added_TS` DATETIME DEFAULT CURRENT_TIMESTAMP
);

创建一个将两个城市表联合的视图:

CREATE VIEW all_cities AS
SELECT id, city_name FROM `cities`
UNION ALL
SELECT id, city_name FROM `cities_users`;

无论何时用户注册,都可以查询VIEW来检查用户的城市是否存在。这样,您将知道原始表中是否存在城市或用户引入的城市。

如果没有,则将新城市插入cities_users表中(连同创建城市以进行日志记录的用户)。

您应该正确生成一个唯一的ID,即在 city 表中永远不会存在的ID。您可以通过多种方式来完成此操作,这是一个简单的示例:取citys_users表中的最后一个ID并添加100万。您的city_users ID将类似于:1000001、1000002、1000003

最后,您将生成的city_users ID插入到users表中。

为用户输入使用单独的表应该可以帮助您保持数据库的干净:

  1. 您的原始城市表完全不变
  2. 您将始终容易地了解谁,何时添加了新城市,并且可以创建一个小的界面来进行审核和管理。
  3. 您的用户正在帮助您完成数据库。

答案 3 :(得分:2)

如果用户建议一个新城市,则应在城市表中创建一个新记录,并将city_id存储到用户表中。这是存储表记录的最佳方法。

答案 4 :(得分:0)

尽管有相反的答案,我还是应该指出,您最初建议在表中添加city_name列的建议会很好地工作

如果您同时允许cities_idcity_name都为空,那么您可以验证应用程序逻辑中是否只设置了其中一个

这种方法的好处是它将使您的城市表保持“纯净”状态,并允许您轻松计算重复次数并分析用户提供的城市

但是它将在您的表中添加非常稀疏的可空city_name

我猜这取决于您要如何从用户那里获得城市(下拉菜单+他人的文本框,带有建议的文本框,只是一个文本框)以及您打算如何处理城市聚集了

您甚至可以通过硬编码下拉菜单或可搜索的下拉菜单将标签更改为“城市(或最近的城市)”,并且不允许用户提供城市

答案 5 :(得分:0)

如果您有一个存放原始数据的缓冲表,即city_name,user_name之间的关系

CREATE TABLE `buffer_city_user` (
`buffer_id` int,
`city_name` varchar(100),
`user_name` varchar(100),
);

您可以首先处理新的city_names的缓冲表-如果找到,则将其插入表中的city。

然后插入用户信息-任何新的城市名称都应该已经在city表中,并且不会出现任何外键问题。