phpMyAdmin 导出问题

问题描述 投票:0回答:3

我的共享主机不允许 SSH 访问。我正在尝试使用 phpMyAdmin 导出数据库并导入到新服务器上。我不断收到此错误,但不知道如何修复它。如有任何帮助,我们将不胜感激。

Error
SQL query:
--
-- Indexes for dumped tables
--
--
-- Indexes for table `EWRporta_blocks`
--
ALTER TABLE  `EWRporta_blocks` ADD PRIMARY KEY (  `block_id` ) ,
ADD KEY  `title` (  `title` ) ;
MySQL said: Documentation
#1068 - Multiple primary key defined 
php mysql phpmyadmin mysql-error-1068
3个回答
1
投票

我多次遇到这个问题,modonoghue 有一种有效的方法来处理它,即删除表并完全重新创建它们。

问题与通用解决方案

基本上发生的情况是,您试图运行 INSERT 语句,将值插入到已经存在的主键中 - 从而给您带来重复键的错误。数据库不知道如何处理具有相同键的多个条目,因为 SQL 逻辑基于每个具有完全唯一主键的“行”。

想要做的是将所有值保存到导出的sql文件中,在查询中,当您再次导入文件时,删除所有现有值(假设您想将其恢复到某个点)并且不用担心导出日期和导入日期之间保存的数据!)并且插入所有导出的值...或者以其他方式避免尝试使用现有密钥添加新条目(请参阅下文)。

导出特定数据库的一种方法(TRUNCATE):

  1. 换句话说,当您使用 PHPMYADMIN 导出 sql 文件时,单击“自定义 - 显示所有可能的选项”。
  2. 在“格式特定选项”下确保选择“结构和数据”(否则您最终可能会删除表并且没有数据来恢复它们!)
  3. 在“数据创建选项”下选择“插入前截断表”——这将删除表中的所有现有数据。

导入时,所有现有数据将从每个表中删除(TRUNCATE),所有导出的数据将写回到表中(INSERT),但表本身不会被删除(DROP)。

忽略与截断(替代路线)

您应该能够跳过上面的步骤 3 (TRUNCATE),而是选择复选框“代替 INSERT 语句使用...”“INSERT IGNORE 语句”

基本上,“忽略”只会跳过导出数据中的重复项,并防止您删除现有数据。如果您只想添加回丢失的数据,而不删除自上次导出以来更改/添加的数据,这非常有用。

超级用户(重复密钥更新)

还有一个 INSERT INTO ... ON DUPLICATE KEY UPDATE ... ,它允许您准确地告诉查询如果存在重复键该怎么办。这可以防止您忽略具有相同键但可能不相同的两个条目。然而,正确设置要复杂得多。


0
投票

正如其他人所说,删除并重新创建表。在 phpmyadmin 中,执行导出时选中标记为“add DROP TABLE”的复选框。那么所描述的问题应该在导入时得到解决。


-1
投票

删除导出工具生成的评论

--
-- Indexes for dumped tables
--
--
-- Indexes for table `EWRporta_blocks`
--

并尝试仅按如下方式执行查询

更改表

EWRporta_blocks
添加主键(
block_id
), 添加密钥
title
(
title
) ;

© www.soinside.com 2019 - 2024. All rights reserved.