小编Geo*_*zes的帖子

MySQL:使用两个外键创建表失败,出现"Duplicate key name"错误

在尝试创建新表时,MySQL正在给我一个我无法解释的错误.

CREATE TABLE Products (
    id INT NOT NULL,
    PRIMARY KEY(id)
);

CREATE TABLE WarehouseMovements (
    time        DATETIME           NOT NULL,
    product1    INT                NOT NULL,
    product2    INT                NOT NULL,

    FOREIGN KEY WarehouseMovements(product1) REFERENCES Products(id),
    FOREIGN KEY WarehouseMovements(product2) REFERENCES Products(id)
);
Run Code Online (Sandbox Code Playgroud)

这失败了ERROR 1061 (42000): Duplicate key name 'WarehouseMovements'.如果我删除外键约束成功,但我想确保product1和product2实际上指向某个地方.

默认引擎是InnoDB.

查询有什么问题?

mysql sql

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

Pandas:使用小于给定值的元素获得第一行的有效方法

我想知道在pandas中是否有一种有效的方法:给定一个数据帧,第一行小于给定值是多少?例如,给定:

      addr
0  4196656
1  4197034
2  4197075
3  4197082
4  4197134
Run Code Online (Sandbox Code Playgroud)

第一个小于4197080的值是多少?我想这回只是4197075.行A的解决办法是先通过过滤器和4197080然后坐最后一排,但是这看起来就像是一个极其缓慢的O(N)操作(第一建设一个数据帧,然后利用其最后一行),而二进制搜索将采用O(logN).

df.addr[ df.addr < 4197080].tail(1)
Run Code Online (Sandbox Code Playgroud)

我计时,并且创造df.addr[ df.addr < 4197080]或多或少的相同df.addr[ df.addr < 4197080].tail(1),强烈暗示内部它首先构建一个完整的df.

num = np.random.randint(0, 10**8, 10**6)
num.sort()
df = pd.DataFrame({'addr':num})
df = df.set_index('addr', drop=False)
df = df.sort_index()
Run Code Online (Sandbox Code Playgroud)

获得第一个较小的值非常慢:

%timeit df.addr[ df.addr < 57830391].tail(1)
100 loops, best of 3: 7.9 ms per loop
Run Code Online (Sandbox Code Playgroud)

使用lt改进了一点:

%timeit df.lt(57830391)[-1:]
1000 loops, best of 3: 853 µs per loop
Run Code Online (Sandbox Code Playgroud)

但仍远不及二元搜索那么快:

%timeit bisect(num, 57830391, 0, len(num))
100000 loops, best …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

括号内的参数包扩展会产生奇怪的输出

我正在尝试实现一个接受可变数量的字符串并转发到print函数的函数,该函数需要char指针和size每个字符串交错.

例:

std::string a = "123";
std::string b = "1234";
forward(a, b); // should call doPrint(a.c_str(), a.size(), b.c_str(), b.size())
Run Code Online (Sandbox Code Playgroud)

我认为以下应该是一个正确的实现,但即使它编译行为是非常令我惊讶的.

template <class ...Args>
void forward(const Args & ... args) {
  doPrint( (args.c_str(), args.size())...);
}
Run Code Online (Sandbox Code Playgroud)

forward(a, b)打电话doPrint(3, 4),而不是doPrint("123", 3, "1234", 4),就像我写的那样doPrint((args.size())...).c_str()编译器完全忽略调用.

我试过g++,clang并且icc所有产生相同的输出.有什么问题(args.c_str(), args.size())...

确实,std::make_tuple(args.c_str(), args.size())...按预期工作,但是我要说我不能改变doPrint接受和处理元组.

c++ variadic-templates c++11

4
推荐指数
2
解决办法
506
查看次数

const-cast一个临时的const引用会导致未定义的行为吗?

C++允许将临时绑定绑定到const引用,从而延长其生命周期.我的问题是:如果我通过const-cast来修改对象,那么这个未定义的行为是什么?让我们假设我的新引用不会比原始的const引用更长,所以它总是指向内存中的有效对象.

如果它确实调用了未定义的行为,那为什么呢?对象存在于堆栈中,如果我能读取它为什么我不能修改它?我理解为什么这可能是一个坏主意,因为临时将很快被销毁,但它是无效的C++?在我的测试中,我的程序在修改临时版后运行正常.

c++

0
推荐指数
1
解决办法
132
查看次数

标签 统计

c++ ×2

c++11 ×1

mysql ×1

pandas ×1

python ×1

sql ×1

variadic-templates ×1