小编And*_*ett的帖子

MySQL"好"的方法,如果找不到就插入一行,或者如果找到则更新它

通常,我想在我的一个用户上运行查询,我希望以1对1的关系存储与该用户相关联的行.所以,让我们说(这只是一个任意的例子),我有一个表跟踪用户的汽车,以及一些关于汽车的信息.每个用户可以拥有0或1辆汽车.如果用户没有汽车,则表中没有该用户的条目.

汽车表(再次,只是一个例子):id,user_id,car_make,car_model

所以,当我更新这个表时,我总是会做这样的事情(伪代码):

result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
    UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
    INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能把它变成一个"原子地"起作用的优雅陈述?如果在另一个进程中SELECT和UPDATE语句之间的行被删除,会发生什么?我的UPDATE语句将失败INSERT语句应该运行的地方.我觉得我需要做两个相似(但不同)的陈述来完成同样的事情!我需要的是一些声明,它将向我保证我想要的数据存在于表中,特别是当我只想要一行满足我的要求时.例如,它可能是这样的(当然这是完全构成的):

MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
Run Code Online (Sandbox Code Playgroud)

这样,如果user_id已经存在,那么它将被更新,否则将被插入.此外,如果我更改了要求,例如说每个用户可以拥有给定car_make的零个或一个汽车,那么我可以进一步指定:

MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
Run Code Online (Sandbox Code Playgroud)

我希望我的问题有道理!如何改进这种经常出现的基本insert-if-not-found或update-if-found操作?谢谢你的帮助!

mysql database-design upsert

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

SQL Server中非常大的表

我们有一个非常大的表(> 77M记录和增长)在SQL Server 2005 64位标准版上运行,我们看到一些性能问题.每天添加的记录多达十万条.

有谁知道SQL Server标准版可以处理的记录数量是否有限制?应该考虑转向企业版还是我们可以使用一些技巧?

附加信息:

有问题的表非常扁平(14列),有一个聚簇索引,有6个字段,另外两个索引在单个字段上.

我们使用3个字段添加了第四个索引,这些字段位于一个问题查询中的选择中,并且没有看到估计性能的任何差异(查询是必须在非工作时间运行的流程的一部分,因此我们没有指标然而).这些字段是聚集索引的一部分.

sql-server sql-server-2005

9
推荐指数
4
解决办法
3万
查看次数

避免系统版本表中的模式不匹配

寻找解决方法:

Error: SQL71609: System-versioned current and history tables do not have matching schemes. Mismatched column: 'XXXX'.
Run Code Online (Sandbox Code Playgroud)

尝试在SSDT中为Visual Studio 2015使用SQL 2016系统版本(时间)表时.

我已经定义了一个基本表:

CREATE TABLE [dbo].[Example] (
    [ExampleId] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [ExampleColumn] VARCHAR(50) NOT NULL,
    [SysStartTime] datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    [SysEndTime] datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)
)
WITH (SYSTEM_VERSIONING=ON(HISTORY_TABLE=[history].[Example]))
GO
Run Code Online (Sandbox Code Playgroud)

(假设[history]在SSDT中正确创建了模式).这是第一次建立良好.

如果我以后做出改变:

CREATE TABLE [dbo].[Example] (
    [ExampleId] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    [ExampleColumn] …
Run Code Online (Sandbox Code Playgroud)

sql-server temporal sql-server-data-tools visual-studio-2015 sql-server-2016

9
推荐指数
2
解决办法
2129
查看次数

设置Perl脚本的有效组ID

我有文件权限问题,我想解决,而不是诉诸于一切世界可写.

我正在将文件写入NetApp SAN.我正在写入的目录由devel用户拥有,并且具有一组devel具有组可写权限(0775)的目录.我写的用户名是在usernamedevel组中.

问题似乎是SAN只检查第一组,所以我得到了许可被拒绝.如果我使用newgrpsg命令将我的组更改为devel,那么我可以写入目录.

尝试写入的脚本是用Perl编写的,但它是通过ssh和一些bash脚本从另一台机器远程启动的.

我无法将目标目录更改为username组,因为还有其他开发人员,他们在不同的组中(但我们都共享该devel组).

我无法使Perl脚本本身具有setgid,因为我们使用适当的组运行不同的环境(devel,test,qa,production等),我不想在该级别管理文件权限位.

我无法setgid在Perl脚本中使用POSIX 函数,因为它不是以root身份启动的(我无法获得root权限),因此我获得了权限被拒绝.分配给$)$(给出相同的结果.

我不能使用newgrpbash中的命令,因为newgrp它不接受任何参数,它只是启动一个新的交互式shell(在新shell退出后执行以下任何命令).

我也无法使用newgrp启动新shell并从那里生成Perl脚本,因为Perl脚本是通过ssh连接在远程计算机上执行的.该脚本将在我的默认组下的远程计算机上获得"新鲜"shell,而不是newgrp在本地计算机上设置的组.

我无法使用该sg命令,因为它只需要一个参数.我引用完整的命令行,包括已知的参数.但是,我们通过ssh启动远程进程的方式包括在"$@"bash变量中传递本地参数.换句话说,我可以做一个process start或者process stop,process脚本处理ssh命令并传递我输入的任何本地参数"$@".我已经尝试过编写一个包装器,但发现我们使用了各种有趣的本地参数形式,并且犹豫是否要潜入必要的引用和逃避噩梦.

所以,我的问题是:是否有人知道从Perl或bash为正在运行的进程设置有效组ID的其他方法?是否存在多参数形式sg

bash perl

5
推荐指数
1
解决办法
3035
查看次数