sql—在mysql中保存不存在的记录

8ftvxx2r  于 2021-06-17  发布在  Mysql
关注(0)|答案(6)|浏览(288)

比方说,我有一个预定义的表,名为 cities ,几乎我国所有的城市。
当用户注册他自己(用户表)时,列 cities_id 在table上 user 存储表中的城市id cities (外键,参考表cities),类似于

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

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

user表存储城市id。
但如果我错过了几个城市。。。然后,用户如何将其城市名称保存在用户表中,该表不接受任何城市名称,只接受ID。
我能再要一个专栏吗 city_name 就在table后面 user 像这样的

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

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

9ceoxa92

9ceoxa921#

这就是我如何快速解决这个问题的方法
创建一个额外的表来存储丢失的城市,这些城市将由用户引入

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`;

每当用户注册时,您都会查询视图以检查该用户的城市是否存在。这样,您就可以知道一个城市是否存在于原始表中,或者用户引入的城市。
如果不是,则在 cities_users 表(以及为记录而创建它的用户)。
你应该正确地生成一个唯一的id,即cities表中永远不存在的id。你可以用不同的方法来实现这一点,这里有一个简单的例子:取cities\u users表中的最后一个id,再加上一百万。你的城市用户ID将是:1000001,1000002,1000003
最后,在users表中插入生成的用户id。
为用户输入创建一个单独的表应该有助于保持数据库的干净:
原来的城市表保持完全不变
您可以随时轻松地了解由谁和何时添加的新城市,并且可以创建一个小界面来查看和管理这些信息。
您的用户正在为您工作以完成数据库。

ghhkc1vu

ghhkc1vu2#

如果用户建议一个新的城市,您应该在cities表中创建一个新记录,并将city\u id存储到users表中。这是存储表记录的最佳方法。

pxyaymoc

pxyaymoc3#

我觉得应该指出的是,尽管答案与此相反,但你最初提出的增加 city_name 表的列将很好地工作
如果你两者都允许的话 cities_id 以及 city_name 如果可以为null,则可以验证在应用程序逻辑中是否设置了其中一个且仅设置了其中一个
这种方法的好处是它可以保持城市表的“纯净”,并允许您轻松地计算和分析用户提供的城市的副本
不过,它会添加一个非常稀疏的可空值 city_name 表中的列
我猜这取决于你想如何从用户那里得到城市(下拉+其他人的文本框,带建议的文本框,只是一个文本框)以及你计划对你聚集的城市做什么
您甚至可以使用硬编码下拉列表或可搜索下拉列表将标签更改为“城市(或最近的城市)”,并且不允许用户提供城市

mnowg1ta

mnowg1ta4#

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

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

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

q5lcpyga5#

正如@joakim在评论中提到的,从db的Angular 来看,由于cities\u id是引用cities表的外键,如果所讨论的城市不在表中,那么将记录插入用户表将失败。
从编程的Angular 来看,如果您想在用户注册时首先自动插入表中不存在的城市,这是可能的。假设您使用的是java和hibernate,并且用户实体包含city实体,那么对用户实体调用saveorupdate()方法将导致插入city记录(如果还没有),然后将用户记录插入到user表中。

u0njafvf

u0njafvf6#

如果你有一个缓冲表,其中的原始数据是放在,即城市名称,用户名之间的关系

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

您可以首先处理新城市名称的缓冲区表-如果找到,则插入到表cities中。
然后插入用户信息-任何新的城市名称都应该已经在cities表中,并且不会出现外键问题。

相关问题