I'll agree to stand corrected if and only if I can also require that there is a unique constraint across all columns.
I don't think that's what you want. Every row (tuple) has to be distinct from every other row. Having a single primary key column makes that so. The problem comes in when you try to query that table. Given this table:
id | city | country ----+--------+--------- 1 | Paris | France 2 | London | England 3 | Paris | Texas 4 | Paris | France
The presence of the primary key (id) makes it a proper relation. However, when we try to query it like this:
select city, country from test; city | country --------+--------- Paris | France London | England Paris | Texas Paris | France
That is not a relation, because it has a duplicate in it. The problem isn't that the table isn't a relation, but that the result of our SQL query isn't a relation. So what is it? This gets to dragonchild's other point, to which you said:
I'm asking for those cities, what's the logical reason for preferring a bag instead of a set? Can you show how this will consistently lead to more correct results?
As I said the result of the above query is not a relation, but a report on the contents of the columns I queried, with the number of rows replicated. It makes sense in that it reports how many rows they are, and SQL is a row-oriented reporting language. So it is consistently more correct if my question is "What are the contents of the city and country colunns in all rows?" Of course, that's not usually a very useful question, but it is at least consistent with how SQL works.
So that's how it makes sense. And as you and I agree, that makes it unrelational. It's a report on rows in a table, not a set created by querying a relation.
—Theory
In reply to Re^5: (OT) Why SQL Sucks (with a little Perl to fix it)
by Theory
in thread (OT) Why SQL Sucks (with a little Perl to fix it)
by Ovid
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |