在我的网站上,有几家供应商可以导入他们的文章。
我想让他们选择清理他们的文章(例如删除不在importfile中的文章)。
我首先想到的是在导入之前首先删除供应商的所有文章,但这可能会导致客户访问该网站并且看不到任何产品(特定供应商的产品)的情况
因此,经过一番思考,我想出了另外两个解决方案:
但是这两个选项可能存在一些问题。
也许我想出的选项还有更多问题。
或许还有其他选择可以做到这一点?
PS
在导入时“锁定”网站/锁定客户不是一种选择。
答案 0 :(得分:2)
当我读到你的问题时,我想到了两个解决方案:
此外,您可以在PostreSQL中重命名表格,如下所示:
ALTER TABLE TableB RENAME TO TableC;
如果您想使用我的“临时表”解决方案,我也使用过这种解决方案,尽管在不太严重的情况下,诚然。但请注意,至少在MySQL InnoDB中,你必须担心外键,如果重命名,它仍将指向旧表,例如如果从TableA到TableB有一个外键,并且您将TableB重命名为TableB_old并将TableB_new重命名为TableB,则外键将指向TableB_old。我不知道PostgreSQL是否就是这种情况。
答案 1 :(得分:1)
我对您建议的方法有所不同:
有一个名为vendortables的表,其中包含vendorname或id的列以及列出其产品的表的名称。
当供应商想要导入时,为输入创建一个新表(可能是vendorname +上传开始时间)。将所有数据上传到其中。完成后,获取当前供应商表的名称(在vendortables中)并更新,以便新表的名称与上载供应商相关联。然后删除旧表(在更新之前抓取)
这样,每次复制都不会有表数据。
示例:
SELECT * FROM vendortables
+--+-----+
|id|table|
+--+-----+
|01|test |
+--+-----+
SELECT * FROM test
+--+----+
|id|name|
+--+----+
|01|car |
+--+----+
//Import & upload new data
CREATE TABLE test1 USING('?', 'new car')
SELECT * FROM test1
+--+--------+
|id|name |
+--+--------+
|01|new car |
+--+--------+
//Phase in new data
UPDATE vendortables SET table='test1' WHERE id='1'
//Delete old table
DROP TABLE test
让PHP向vendortables
询问负责显示供应商产品的表的名称。
此外,由于您提到您的网站使用率很高,您是否认为缓存可能会导致导入过程中的请求非常不可能。
答案 2 :(得分:0)
制作删除表
delete from del_vendor_article where vendorid='vendorid'
在文章更新
上执行此操作insert into del_vendor_article SET vendorid='vendorid', article_id='articleid'
可能会向他们展示将要删除的内容。然后他们可以删除他们想要保留的任何内容
SELECT item FROM articles WHERE NOT EXISTS (SELECT * FROM del_vendor_article WHERE articles.articles_id = del_vendor_article.articles_id);
删除未导入的项目
delete from articles WHERE NOT EXISTS (SELECT * FROM del_vendor_article WHERE articles.articles_id = del_vendor_article.articles_id);