小编wis*_*nij的帖子

存在外键约束时更改MySQL主键

我有两个已经存在的表,看起来(部分)大致是这样的:

CREATE TABLE parent (
    old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE child (
    parent_key CHAR(8),
    FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我想添加一个新的自动递增整数id列,parent并将其用作主键,同时仍保留old_pk为唯一键,并允许其他表喜欢child在外键约束中引用它.不幸的是,简单说ALTER TABLE parent DROP PRIMARY KEY不起作用:

错误代码:1025

将'./data/#sql-4013_70f5e'重命名为'./data/parent'时出错(错误号:150)

一些谷歌搜索表明这是由于现有的外键引用child.从本质上讲,我需要一种方法告诉M​​ySQL"使用其他列作为主键,但不要忘记原始列的唯一键 - ".有没有办法实现这一点,除了从中删除关键约束child并在之后恢复它们?

假设我必须在适当的位置更改表,而不是使用相同的数据创建副本并在以后交换它们.我SET FOREIGN_KEY_CHECKS = 0在改变表之前尝试过使用,但它似乎没有帮助.

mysql constraints foreign-keys primary-key mysql-error-1025

8
推荐指数
1
解决办法
1万
查看次数

在Perl中将分组的十六进制字符转换为位串

我有个十六进制字符一些256个字符的字符串代表位标志的序列,我试图将其转换回为一个比特,所以我可以操纵它们&,|,vec等.十六进制字符串是用整数范围的大端组写的,这样一组8个字节就像"76543210"应转换为"\x10\x32\x54\x76"位串,即最低的8位00001000.

问题是pack'" h"格式一次只能输入一个字节,而不是8,因此直接使用它的结果将不是正确的顺序.目前我正在这样做:

my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
Run Code Online (Sandbox Code Playgroud)

哪个有效,但感觉很乱.似乎应该有一个更清洁的方式,但我的pack-fu不是很强大.有没有更好的方法来进行这种翻译?

perl endianness bitstring pack

4
推荐指数
1
解决办法
2823
查看次数