设计模式通常与面向对象的设计有关.
是否有用于创建和编程关系数据库的设计模式?
许多问题肯定必须有可重复使用的解决方案.
示例包括表格设计,存储过程,触发器等模式......
是否有类似于martinfowler.com的此类模式的在线存储库?
模式可以解决的问题示例:
我需要编写一个T-SQL存储过程来更新表中的行.如果该行不存在,请插入它.所有这些步骤都由事务包装.
这是一个预订系统,所以它必须是原子和可靠的.如果交易已提交且预订航班,则必须返回true.
我是T-SQL的新手,不知道如何使用@@rowcount
.这是我到现在为止所写的.我在正确的道路上吗?我确信这对你来说很容易.
-- BEGIN TRANSACTION (HOW TO DO?)
UPDATE Bookings
SET TicketsBooked = TicketsBooked + @TicketsToBook
WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)
-- Here I need to insert only if the row doesn't exists.
-- If the row exists but the condition TicketsMax is violated, I must not insert
-- the row and return FALSE
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Bookings ... (omitted)
END
-- END TRANSACTION …
Run Code Online (Sandbox Code Playgroud) 我已经编写了一个存储过程,如果存在记录将进行更新,否则它将进行插入.它看起来像这样:
update myTable set Col1=@col1, Col2=@col2 where ID=@ID
if @@rowcount = 0
insert into myTable (Col1, Col2) values (@col1, @col2)
Run Code Online (Sandbox Code Playgroud)
我以这种方式编写它的逻辑是更新将使用where子句执行隐式选择,如果返回0,则插入将发生.
这样做的替代方法是进行选择,然后根据返回的行数进行更新或插入.我认为这是低效的,因为如果要进行更新,将导致2次选择(第一次显式选择调用,第二次隐式更新位置).如果proc要进行插入,那么效率就没有差别.
我的逻辑声音在这里吗?这是如何将插入和更新组合到存储过程中的?
MySQL有这个非常有用但又很合适的REPLACE INTO
SQL命令.
这可以在SQL Server 2005中轻松模拟吗?
开始一个新的事务,在做了Select()
,然后要么UPDATE
或INSERT
和COMMIT
始终是一个痛苦的一点点,在应用程序中做特别是当,因此能始终保持2个版本的声明.
我想知道是否有一种简单而通用的方法将这样的功能实现到SQL Server 2005中?
我有下表的柜台:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Run Code Online (Sandbox Code Playgroud)
我想增加其中一个计数器,或者如果相应的行还不存在则将其设置为零.有没有办法在标准SQL中没有并发问题的情况下执行此操作?该操作有时是交易的一部分,有时是分开的.
如果可能的话,SQL必须在SQLite,PostgreSQL和MySQL上不加修改地运行.
搜索产生了一些想法,这些想法要么遇到并发问题,要么特定于数据库:
尝试换INSERT
行,UPDATE
如果出现错误.不幸的是,INSERT
中止当前事务的错误.
UPDATE
行,如果没有修改行,则为INSERT
新行.
MySQL有一个ON DUPLICATE KEY UPDATE
条款.
编辑:感谢所有的好评.看起来保罗是对的,并没有单一,便携的方式来做到这一点.这对我来说非常令人惊讶,因为它听起来像是一个非常基本的操作.
我在两个不同的数据库中有两个表.在table1中(在database1中)有一个名为column1的列,它是一个主键.现在在table2(在database2中)有一个名为column2的列,我想将它添加为外键.
我试图添加它,它给了我以下错误:
消息1763,级别16,状态0,行1
不支持跨数据库外键引用.外键Database2.table2.消息1750,级别16,状态0,行1
无法创建约束.查看以前的错误.
我是如何做到这一点的,因为表位于不同的数据库中.
在MySQL中,如果指定ON DUPLICATE KEY UPDATE且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行的UPDATE.例如,如果列a声明为UNIQUE并包含值1,则以下两个语句具有相同的效果:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
Run Code Online (Sandbox Code Playgroud)
我不相信我在T-SQL中遇到过类似的东西.SQL Server是否提供了与MySQL的ON DUPLICATE KEY UPDATE相当的东西?
How do you say以下Microsoft SQL Server 2005:
IF EXISTS (SELECT * FROM Table WHERE FieldValue='') THEN
SELECT TableID FROM Table WHERE FieldValue=''
ELSE
INSERT INTO TABLE(FieldValue) VALUES('')
SELECT TableID FROM Table WHERE TableID=SCOPE_IDENTITY()
END IF
Run Code Online (Sandbox Code Playgroud)
我要做的是查看是否已经有一个空白的fieldvalue,如果有则返回TableID,否则插入一个空白的fieldvalue并返回相应的主键.
我有一个表,我在其中为员工插入行,但下次当我想插入行时我不想再插入该员工的数据只是想要更新所需的列,如果它退出那里,如果没有然后创建新行
我们如何在SQL Server 2005中执行此操作?
我正在使用jsp
我的疑问是
String sql="insert into table1(id,name,itemname,itemcatName,itemQty)values('val1','val2','val3','val4','val5')";
Run Code Online (Sandbox Code Playgroud)
如果它是第一次然后将其插入数据库,否则如果存在更新它
怎么做?
我想知道如何使用一个语句在SQL Server中使用UPSERT
或换句话说UPDATE if records exists Else enter new record
操作?
这个例子显示了在Oracle中实现这一目标的方式在这里
,但它使用Dual
表,它这不存在SQL Server
.
那么,任何SQL Server替代品(没有存储过程)好吗?
sql-server ×7
sql ×6
t-sql ×4
mysql ×3
upsert ×2
foreign-keys ×1
postgresql ×1
rdbms ×1
sqlite ×1