天道酬勤,学无止境

innodb

添加外键时出错(Error while adding Foreign key)

问题 我正在使用 Mysql 工作台。 我已经做好了桌子。 现在我想在名为Personal_Details的表中添加外键,该键是Login表中的主键。 但是当我尝试这样做时,它显示了以下错误: ERROR 1005: Can't create table 'shaadiDB.#sql-404_25' (errno: 121) SQL语句: ALTER TABLE `shaadiDB`.`Personal_Details` ADD CONSTRAINT `Login_Id` FOREIGN KEY (`Login_Id` ) REFERENCES `shaadiDB`.`Login` (`Login_Id` ) ON DELETE NO ACTION ON UPDATE NO ACTION , ADD INDEX `Login_Id` (`Login_Id` ASC) 回答1 似乎表Personal_Details有数据,其中可能有一些带有 Login_Id 的行,其条目在表Login不存在。 如果是这种情况,那么解决方案是您需要将数据移动到另一个表,然后添加约束。 添加约束后,您需要将所有行逐一添加回表 1。 回答2 错误 121 :当键名重复时,会显式抛出此错误。 在运行您的Alter ...语句后,立即执行以下操作并观察结果。 SHOW ENGINE InnoDB STATUS

2021-09-24 06:24:49    分类:技术分享    mysql   sql   foreign-keys   innodb   foreign-key-relationship

Error while adding Foreign key

I am using Mysql Workbench. I have already made the table. Now I want to add foreign key in a table called Personal_Details that key is primary key in Login table. But when I am trying to do so, it shows me the following error: ERROR 1005: Can't create table 'shaadiDB.#sql-404_25' (errno: 121) SQL Statement: ALTER TABLE `shaadiDB`.`Personal_Details` ADD CONSTRAINT `Login_Id` FOREIGN KEY (`Login_Id` ) REFERENCES `shaadiDB`.`Login` (`Login_Id` ) ON DELETE NO ACTION ON UPDATE NO ACTION , ADD INDEX `Login_Id` (`Login_Id` ASC)

2021-09-23 18:20:02    分类:问答    mysql   sql   foreign-keys   innodb   foreign-key-relationship

如何压缩 MySQL 中的列?(How to compress columns in MySQL?)

问题 我有一个表,用于存储电子邮件通信。 每次有人回复时,整个路径也会被包含并保存到数据库中(我需要那样做,因为要纠正的应用程序级别的更改量会太高)。 mail文本列的大小为10000 。 但是,我无法存储更多文本。 由于我不确定,可以出现多少个对应关系,我不知道该列的合适数字是多少。 引擎是InnoDB 。 我可以在MySQL使用某种列压缩技术来避免增加列的大小吗? 而且,如果我继续将 varchar 列增加到 20000 会怎样。该表有大约 200 万条记录。 这会是一件好事吗? 回答1 您可能正在寻找 MySQL COMPRESS() 和 UNCOMPRESS() 函数来分别压缩数据以进行存储和检索。 另请查看 InnoDB 压缩用法。 回答2 只要数据不需要编辑,就可以使用归档引擎。 回答3 此答案特定于 Percona Percona 不久前引入了一种压缩列格式。 您可以在 CREATE 或 ALTER 上使用 CREATE TABLE test_compressed ( id INT NOT NULL PRIMARY KEY, value MEDIUMTEXT COLUMN_FORMAT COMPRESSED ); 参考:https://www.percona.com/doc/percona-server/5.7/flexibility/compressed

2021-09-21 15:46:25    分类:技术分享    mysql   compression   innodb

InnoDB:无法打开或创建系统表空间(InnoDB: Could not open or create the system tablespace)

问题 我在 Xaamp 上打开 mysql 服务器时遇到这个问题 错误:MySQL 意外关闭。 这可能是由于端口被阻塞、缺少依赖项、权限不当、崩溃或被其他方法关闭。 按“日志”按钮查看错误日志并检查 Windows 事件查看器以获取更多线索 如果您需要更多帮助,请复制整个日志窗口并将其发布到论坛和错误日志上 enter code here 2015-04-06 19:28:56 3576 [Note] Plugin 'FEDERATED' is disabled. 2015-04-06 19:28:56 2334 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator. 2015-04-06 19:28:56 3576 [Note] InnoDB: Using atomics to ref count buffer pool pages 2015-04-06 19:28:56 3576 [Note] InnoDB

2021-09-19 21:03:23    分类:技术分享    mysql   innodb

innodb_lock_wait_timeout 增加超时时间(innodb_lock_wait_timeout increase timeout)

问题 我正在使用 MySQL 数据库并尝试在插入后立即更新记录,因此出现以下错误ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction 。 所以我通过以下查询减少超时:- set GLOBAL innodb_lock_wait_timeout=1 所以我的问题是:-可以这样做吗? 它会导致其他问题,如性能问题等吗? 感谢您的帮助。 回答1 如果这是一个 Web 应用程序并且您试图从一个页面到下一个页面挂起事务,请不要; 它不会工作。 你说的“就在之后”是什么意思? 如果你在两个语句之间什么都不做,即使是 1 秒的超时也应该足够大。 mysql> SET GLOBAL innodb_lock_wait_timeout = 1; mysql> SELECT @@innodb_lock_wait_timeout; +----------------------------+ | @@innodb_lock_wait_timeout | +----------------------------+ | 50 | +--------------

2021-09-18 18:35:21    分类:技术分享    php   mysql   database   timeout   innodb

如何加速 InnoDB count(*) 查询?(How to speed up InnoDB count(*) query?)

问题 这里有许多类似的问题,但很多答案都说要强制使用索引,这对我来说似乎并没有加快速度。 我想在我的网站上显示一个“实时”计数器,显示表中的行数。 有点像一些网站如何“实时”显示注册用户的数量或其他一些统计数据(即使用 ajax 或 websockets 频繁更新)。 我的表有大约 500 万行。 它增长得相当快,并且有大量的插入和删除。 跑步 select count(*) from my_table 需要 1.367 秒,这是不可接受的,因为我需要我的应用程序每秒获取一次新行计数。 我尝试了这里的许多答案建议并将查询更改为: select count(*) from my_table use index(my_index) 其中my_index是Normal , bigint字段上的BTREE 。 但是时间居然增加到了1.414秒。 为什么不使用索引加速查询,因为这里有很多答案说它会? 一些答案建议的另一种选择是在表上放置一个触发器,以增加另一个表中的列。 所以我可以创建一个stats ,每当在my_table插入或删除一行时,都会触发增加或减少stats中的一列。 这是唯一的其他选择,因为使用索引似乎不起作用? 编辑:这是我正在尝试完成的事情类型的一个完美示例:https://www.freelancer.com。 滚动到页面底部,您将看到: 这些数字大约每秒更新一次。

2021-09-18 17:06:18    分类:技术分享    mysql   sql   count   innodb

锁定 innodb 的傻瓜指南(Dummies guide to locking in innodb)

问题 关于锁定 innodb 的典型文档太混乱了。 我认为有一个“innodb 锁定的傻瓜指南”会很有价值 我将开始,并将所有回复作为 wiki 收集: 在应用行级锁定之前需要对列进行索引。 示例:删除 column1=10 的行; 除非对 column1 建立索引,否则将锁定表 回答1 以下是我使用 MySQL 支持解决最近一个奇怪的锁定问题(版本 5.1.37)的笔记: 为到达正在更改的行而遍历的所有行和索引条目都将被锁定。 它涵盖在: http://dev.mysql.com/doc/refman/5.1/en/innodb-locks-set.html “锁定读取、更新或删除通常会在 SQL 语句处理中扫描的每个索引记录上设置记录锁定。语句中是否存在 WHERE 条件会排除该行并不重要。InnoDB 确实如此不记得确切的 WHERE 条件,而只知道扫描了哪些索引范围。...如果您没有适合您的语句的索引,并且 MySQL 必须扫描整个表来处理该语句,则表的每一行都被锁定,这在turn 阻止其他用户对表的所有插入。” 如果是真的,那真是令人头疼的问题。 这是。 通常有用的解决方法是: UPDATE whichevertable 将任何内容设置为主键所在的内容(从哪个表中选择主键,其中约束按主键排序); 内部选择不需要锁定,更新将减少更新工作。 order by

2021-09-18 10:01:42    分类:技术分享    mysql   locking   innodb

MySQL 5.6.10 InnoDB 无法创建表,因为表已存在(MySQL 5.6.10 InnoDB cannot create table as table already exists)

问题 我有一个非常有趣的案例。 我的几个 InnoDB 表不知何故损坏了。 表的 .frm 文件消失了,只剩下 .ibd 文件。 我以为没问题,我会从备份中恢复这些表,所以我删除了 .frm 文件并尝试创建具有相同名称的新表,但是每次我得到“表已经存在”时,.ibd 文件得到创建,但 .frm 不是。 基本上现在我无法在给定的数据库中使用给定的名称创建 InnoDB 表。 我唯一的解决方案是创建 MyISAM 表,但我仍然想知道如何解决这个问题。 以下是事件的详细日志: 尝试创建表: CREATE TABLE employee ( employee_id varchar(20) NOT NULL, PRIMARY KEY ( employee_login_id ) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 ROW_FORMAT=COMPRESSED 表已经存在 尝试删除该表以表明它不存在: DROP TABLE 员工 表不存在 我手动删除了employee.ibd文件(没有employee.frm文件) 再次尝试 #1 并再次收到“表已经存在” 我已经重新启动了 MySQL,没有任何变化。 我已经重新启动了整个服务器,没有任何变化。 我无法再在此表空间中创建名为“employee”的 InnoDB 表。

2021-09-18 09:49:37    分类:技术分享    mysql   innodb

如何在 AWS RDS 上修复 InnoDB 损坏锁定表名(错误号:-1)?(How do I fix InnoDB corruption locking a table name from creation (errno: -1) on AWS RDS?)

问题 提示:不要运行ALTER为“标准TCP / IP通过SSH”连接在MySQL Workbench中的语句。 最好进入服务器并从那里运行ALTER 。 这样,如果您失去与服务器的连接, ALTER仍应完成其工作。 我正在尝试在我昨天尝试创建的数据库中创建一个新表。 问题是,我的互联网一直在微辍学中失去连接。 我相信在我创建表时发生了这些 blip 之一,现在当我尝试创建一个具有完全相同名称的表时: CREATE TABLE IF NOT EXISTS `adstudio`.`data_feed_param` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; 我收到此错误: Error Code: 1005. Can't create table 'adstudio.data_feed_param' (errno: -1) 以前,我尝试使用许多其他列创建此表,其中一个名为input_type ,并且我有一列与input_type具有外键关系: CREATE TABLE IF NOT EXISTS `adstudio`.`data_feed_param` ( `id` BIGINT UNSIGNED NOT

2021-09-18 09:29:57    分类:技术分享    mysql   amazon-web-services   innodb   amazon-rds   errno

一张表中同一列上的两个外键(Two foreign keys on the same column from one table)

问题 我有一个项目表,其中有一个image_id字段和一个newsimage_id字段。 两者都链接到图像表。 但是 InnoDB 不允许我将两个字段的外键设置为同一列 ( id )。 有什么办法可以做到这一点还是不可能? 我正在通过 MAMP 使用 MySQL。 提前致谢!! 回答1 这是我的做法(MySQL 5.0.45): ALTER TABLE `job_dependency` ADD FOREIGN KEY (`job`) REFERENCES `job` (`id`), ADD FOREIGN KEY (`dependency`) REFERENCES `job` (`id`); 这种情况下ON DELETE CASCADE有问题,所以不要使用它。

2021-09-14 18:13:57    分类:技术分享    mysql   innodb   relationships