如果我在Postgresql中有一个表:
create table Education (
id integer references Profiles(id),
finished YearValue not null,
started YearValue,
qualification text,
schoolName text,
studiedAt integer references Organizations(id),
primary key (id)
);
Run Code Online (Sandbox Code Playgroud)
我需要创建一个约束,以便schoolName或者studiedAt不需要为null(其中一个必须包含信息).
我该怎么做呢?
我试图在Sql Server(2012)中找到等效的以下MySql查询?
INSERT INTO mytable (COL_A, COL_B, COL_C, COL_D)
VALUES ( 'VAL_A','VAL_B', 'VAL_C', 'VAL_D')
ON DUPLICATE KEY UPDATE COL_D= VALUES(COL_D);
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
PS.我已经读过MERGE查询具有类似的功能,但我发现它的语法非常不同.
阅读这个问题我刚刚学会了blackhole表技巧的存在:基本上是使用单个表来插入数据,然后是在许多其他表中分割数据的触发器.
一旦开发项目的开发人员意识到这一点,我想知道这是否会导致问题.
这个tecnique的优点和缺点是什么?
编辑:当我看到这个例子时,我想到的眨眼是关于交易:如果由于某种原因交易失败,你会找到blackhole包含原始数据的行,用于历史目的,也许可以帮助调试 - 但这似乎成为我能看到的唯一+1黑洞.想法?
可能重复:
数据库是否触发了恶意?
关于数据库触发器有很多负面信息,只是想让社区在好的和坏的时候采取行动.
我一直在阅读(mysql)触发过去几天...特别是我想要做的是找出一个更新用户信息的好方法.
用于此的案例与用户管理系统有关:
例如,admin用户将用户更新regular为a manager,此用户type更改将enable|disable接口上的软件功能.
问题:type除非您查询数据库并重置例如$_SESSION['user']['type']变量和/或用户登录系统,否则
您将不会知道此用户更改.
问题:有没有什么好方法可以解决这个问题?
我想将表格行中的字段值限制为特定范围.是否可以将我的relationship_level字段限制为[0.00到1.00]?
目前我正在使用DECIMAL(2,2),它不允许DECIMAL(1,2),因为M必须> = D.我假设DECIMAL(2,2)的数据类型实际上允许来自00.00的值高达99.99?
CREATE TABLE relationships (
from_user_id MEDIUMINT UNSIGNED NOT NULL,
to_user_id MEDIUMINT UNSIGNED NOT NULL,
relationship_level DECIMAL(2,2) UNSIGNED NOT NULL,
PRIMARY KEY (from_user_id, to_user_id),
FOREIGN KEY (from_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (to_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
INDEX relationship_from_to (to_user_id, from_user_id, relationship_level)
) ENGINE = INNODB;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,谁能预见到任何限制?
非常感谢!
我建议使用触发器检查交叉表完整性约束来回答这个问题.评论中建议它可能会导致问题:
执行跨行检查的触发器很少在大多数数据库上工作...因为它们无法从其他事务中读取未提交的行
但是,我没有找到任何支持索赔的消息来源.官方 文档没有提到任何内容.我发现的其他问题在这里也有所涉及- 它主要批评潜在的隐藏复杂性,因为触发器在第一眼看不到.即使是评分最高的答案也会承认他们对完整性问题的使用.
所以我的问题是:数据库触发器对于跨表完整性约束是否安全?特别是,下面的解决方案是否有效?
总结原始问题.我们有桌子
BetName和PlayerID组合的约束是唯一的约束.建议触发器的定义:
CREATE TRIGGER check_bet_name BEFORE INSERT ON plays_in
FOR EACH ROW BEGIN
DECLARE bet_exists INT DEFAULT 0;
DECLARE msg VARCHAR(255);
SELECT 1 INTO bet_exists
FROM Bet AS b1
WHERE b1.BetID = NEW.BetID
AND EXISTS (SELECT *
FROM plays_in AS p JOIN Bet AS b2 USING (BetID)
WHERE p.PlayerID = NEW.PlayerID AND b2.BetName = b1.BetName …Run Code Online (Sandbox Code Playgroud) 我有一个TargetTable有DECIMAL(20, 7)列的目标表.我也有一个SourceTable包含DECIMAL(20, 7)列的源表,但是这个表中的值都是整数.
当我尝试将数据UPSERT成TargetTable从SourceTable通过MERGE声明,我得到一个标准错误.
算术溢出错误将数字转换为数据类型数字.
我真的不明白为什么会发生这种情况,因为两种数据类型都是相同的.
但奇怪的是:当我使用SELECT INTOon TargetTable来创建测试表TestTable,然后将合并的目标更改为TestTable,upsert完成.我也弄不明白为什么会是这样,因为TargetTable和TestTable是大部分相同.
有没有人遇到过这个,这是一个错误,还是有一些我不知道的SQL Server的细微差别?
示例代码:
失败:
SET NUMERIC_ROUNDABORT Off
GO
MERGE
TargetTable Target
USING
(
SELECT
cast(forecast as DECIMAL(20, 7)) forecast
,[SegmentID]
,[Country]
,[Environment]
,[YearColumn]
,[ForecastYear]
,[Criterion]
FROM
SourceTable
) Source
ON
(
Target.SegmentID = Source.SegmentID
AND Target.Country = Source.Country
AND Target.Environment = Source.Environment
AND Target.YearColumn = …Run Code Online (Sandbox Code Playgroud) SQL Server 触发器允许访问 两个特殊表。INSERTED- 具有“之后”值和DELETED“之前”值。
这些存储在哪里?它们是否存在于tempdb或与所操作的表位于同一个数据库中?
如果我想在表格中创建性别字段,如何确保我的数据库不接受除"M"或"F"之外的任何值?
$sqlCommand = "CREATE TABLE members (
id int(11) NOT NULL auto_increment,
...
...
...
...
gender
)";
Run Code Online (Sandbox Code Playgroud)
谢谢
mysql ×6
sql ×6
sql-server ×4
triggers ×3
database ×2
postgresql ×2
constraints ×1
decimal ×1
php ×1
session ×1
sqldatatypes ×1
transactions ×1