Catch up on stories from the past week (and beyond) at the Slashdot story archive


Forgot your password?
Check out the new SourceForge HTML5 internet speed test! No Flash necessary and runs on all devices. ×

Comment Nobody knows yet (Score 3, Informative) 165

While Brexit means London soon won't have access to the EU's open market across the continent,

Nobody knows yet whether this will turn out to be true. The negotiators may be able to cook up some deal that keeps the UK within the single market but outside the European Union (broadly as happens for Norway). On the other hand, a complete break is also a possibility.

Comment Re:Sadly needed (Score 2) 119

If Microsoft bothered to distinguish between 'opening' a file and 'running' a program - and double-click would only open, not run - then at least part of the problem would be fixed. But since the earliest days of Windows, the same verb 'Open' has been used for both operations. We can't blame users if they have been trained that double-clicking is the standard way to open a file (surely a safe operation in any sanely written system) but then the OS turns it into the much more dangerous operation of running a program.

Comment Re:I'm somewhat (Score 1) 105

Many RDBMSes allow more than one statement per batch - so you can execute two or more statements in a single round trip. For example you could do 'if exists (blah) ...', assuming your dialect of SQL supports it, in just one round trip, or even separate 'insert where not exists... update...' or whatever technique you want to use. (I am not saying that these techniques are a foolproof alternative to merge or upsert, they are not, but that is for another discussion.) If you have multiple rows, you can still prepare a statement handle and handle them in the same number of round trips it would require for a single insert, or at most one extra round trip for the whole batch. Essentially - the checking for an existing row, even without a merge / update builtin, can usually be done in SQL rather than clunkily by the client app.

Comment Re:I'm curious (Score 1) 105

There is no exact equivalent in traditional SQL. As others have pointed out, you can check exists and then insert, but that introduces a race condition; wrapping it in an explicit transaction might help depending on the locking model, but might still introduce failures that have to be introduced by client code.

That said, if you can make some assumptions about what else is writing to the table then you can get fairly close. One technique I often use is like this:

-- Insert the row if none with the same PK exists.
-- As a single SQL statement, this executes atomically
-- in all but the most braindead DBMSes.
insert into mytable (keycol, datacol)
select 1, 'a'
where not exists (
select 0
from mytable
where keycol = 1

-- OK, now there is definitely a row there with keycol=1.
-- Update the row which exists.
-- This is redundant work if we just inserted it above, but do it anyway.
update mytable
set datacol = 'a'
where keycol = 1

This is clearly not safe in general. If there are others accessing the table and doing general delete, or test-and-set, it can lose data. However, if you know that code like the above is the only code accessing the table, or if you restrict it to the above plus simple inserts, then you have a safe way to insert-or-update a row that doesn't involve holding locks for a period of time and doesn't require an explicit transaction.

Slashdot Top Deals

Machines that have broken down will work perfectly when the repairman arrives.