SQL table constraint on column - c#

I have two table Users and Appointements.
In the User table I got the following fields:
Id_user, email, lastName, FirstName, hash, salt.
I put a CONSTRAINT [UNQ_email] UNIQUE NONCLUSTERED ([email] ASC).
In the Appointement I got the following fields:
Id_Appointement, doctorName, date_App, time_App, patientLstName, patientFirstName, patientFirstName, IsAvailable, email.
I put a CONSTRAINT [fk_emailPatient] FOREIGN KEY ([emailPatient]) REFERENCES [dbo].[User] ([email])
I will like to do something similar to this but with the lastName and FirstName.
Any idea on how to do this since there are not a KEY. Which constraint I can put in this case?
Here are the table definitions:
CREATE TABLE [dbo].[Users] (
[Id_user] INT IDENTITY (1, 1) NOT NULL,
[email] NVARCHAR (50) NOT NULL,
[hash] NVARCHAR (50) NOT NULL,
[salt] NVARCHAR (50) NOT NULL,
[lastName] NVARCHAR (50) NULL,
[firstName] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([Id_user] ASC),
CONSTRAINT [UNQ_email] UNIQUE NONCLUSTERED ([email] ASC)
);
CREATE TABLE [dbo].[Apointement] (
[Id_Appointement] INT IDENTITY (1, 1) NOT NULL,
[doctor] NVARCHAR (50) NOT NULL,
[dateApp] DATE NOT NULL,
[heureApp] TIME (7) NOT NULL,
[patientLstName] NVARCHAR (50) NULL,
[patientFirstName] NVARCHAR (50) NULL,
[IsAvailable] BIT NULL,
[email] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([rdvId] ASC),
CONSTRAINT [fk_emailPatient] FOREIGN KEY ([emailPatient]) REFERENCES [dbo].[Users] ([email])
);
I will like to add a constraint on lastName and firstName but these can be NOT unique since we can have to person with the same lastname and firstname but with a different email address.
Thanks

Related

One-to-One relationship in Entity Framework

I'm using E.F db first and I have two tables :
User details :
CREATE TABLE [dbo].[detailsUtilisateur]
(
[idDetailsUtilisateur] INT IDENTITY (1, 1) NOT NULL,
[nomUtilisateur] VARCHAR (30) NULL,
[prenomUtilisateur] VARCHAR (30) NULL,
[compagnieNom] VARCHAR (30) NULL,
[noTelephone] NCHAR (10) NULL,
[adresse] VARCHAR (40) NULL,
[ville] VARCHAR (30) NULL,
[pays] VARCHAR (30) NULL,
[etat] VARCHAR (30) NULL,
[codePostal] NCHAR (6) NULL,
CONSTRAINT [pk_idDetailsUtilisateur]
PRIMARY KEY CLUSTERED ([idDetailsUtilisateur] ASC),
CONSTRAINT [fk_idDetailsUtilisateur]
FOREIGN KEY ([idDetailsUtilisateur]) REFERENCES [dbo].[Utilisateur] ([idUtilisateur])
);
User
CREATE TABLE [dbo].[Utilisateur]
(
[idUtilisateur] INT IDENTITY (1, 1) NOT NULL,
[email] VARCHAR (30) NOT NULL,
[mdp] VARCHAR (90) NOT NULL,
CONSTRAINT [pk_utilisateur]
PRIMARY KEY CLUSTERED ([idUtilisateur] ASC),
UNIQUE NONCLUSTERED ([email] ASC)
);
I'm trying to add a user, then his details. But I get an error:
Referential mapping on the column idDetailsUtilisateur.
I don't understand because the table detailsUtilisateur had a column idDetailsUtilisateur which is a primary key and a foreign key, why did I get this error? Thank you

My auto increment does not start with 1

CREATE TABLE DUser (
[ID] INT NOT NULL, [DUser_Id] VARCHAR(45) NULL,
[Name] VARCHAR (70) NOT NULL,
[DOB] DATE NOT NULL,
[Password] VARCHAR (30) NOT NULL,
[Email] VARCHAR (70) NOT NULL,
[Phone_Number] INT NOT NULL,
[Gender] VARCHAR (6) NOT NULL, PRIMARY KEY CLUSTERED ([ID] ASC) );
Create TRIGGER DUser_IDColumn
ON DUser
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE duserid SET
DUser_ID = 'U' + LEFT('0000' + CAST(inserted.ID AS VARCHAR(10)), 5) FROM DUser duserid
INNER JOIN inserted
ON duserid.ID = inserted.ID
END GO
The ID starts at U00000, when I want it to start from U00003, as there are pre-defined values.
PLEASE I NEED HELP!!
When I Create an user account
Looks like you need to reseed your AUTO-INCREMENT like below using ALTER statement
ALTER TABLE DUser AUTO_INCREMENT = 1
From your posted code, I don't see that it's a autoincrement column at all. Then there is no way you can expect it to start from 1. It's looks like custom identity column.
CREATE TABLE DUser (
[ID] INT NOT NULL
Can't you, in you script where you create the table "DUser" put something like
`AUTO_INCREMENT=3`
?
So It will be something like
CREATE TABLE DUser (
[ID] INT NOT NULL,
[DUser_Id] VARCHAR(45) NULL,
[Name] VARCHAR (70) NOT NULL,
[DOB] DATE NOT NULL,
[Password] VARCHAR (30) NOT NULL,
[Email] VARCHAR (70) NOT NULL,
[Phone_Number] INT NOT NULL,
[Gender] VARCHAR (6) NOT NULL, PRIMARY KEY CLUSTERED ([ID] ASC) )
ENGINE=InnoDB AUTO_INCREMENT=3;

Two types of Users with one Login form - ASP.NET

I'm working with ASP.NET Web applicaton and i'm completly lost with my project ! i have done so many methods but nothing has worked ! please i need someone to help me ! i have 2 types of tables (Sellers and DevilryMen ) now they are in tow separate tables (before they were in one table but everything went so wrong ! then i have decided to make it completely separate ) now i have finished the Registration page for both of them but my problem with the Login page ! i want to make one Login form for both but it didn't work ! could anyone please tell me if this is possible to make ? and how ? i know it's completely random question but i always end up delete everything and start again !
in case you need to look at my code :
1- First_Home.aspx:
<form id="form2">
<asp:Login ID = "Login1" runat = "server" OnAuthenticate= "ValidateUser" UseSubmitBehavior="False" ></asp:Login>
</form>
2- First_Home.aspx.cs: i have done a login for Sellers only
protected void ValidateUser(object sender, AuthenticateEventArgs e)
{
int userId = 0;
string constr = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("Seller_Validate_User"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("#Username", Login1.UserName);
cmd.Parameters.AddWithValue("#Password", Login1.Password);
cmd.Connection = con;
con.Open();
userId = Convert.ToInt32(cmd.ExecuteScalar());
con.Close();
}
switch (userId)
{
case -1:
Login1.FailureText = "Username and/or password is incorrect.";
break;
case -2:
Login1.FailureText = "Account has not been activated.";
break;
default:
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet);
break;
}
}
}
UPDATE :
Database Tables :
CREATE TABLE [dbo].[Users] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Username] NVARCHAR (50) NOT NULL,
[Password] NVARCHAR (50) NOT NULL,
[Email] NVARCHAR (50) NOT NULL,
[UserType] INT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [AK_Users_Email] UNIQUE NONCLUSTERED ([Email] ASC),
CONSTRAINT [AK_Users_Username] UNIQUE NONCLUSTERED ([Username] ASC)
);
CREATE TABLE [dbo].[Sellers] (
[Seller_ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
[SUsername] NVARCHAR (50) NOT NULL,
[Password] NVARCHAR (50) NOT NULL,
[SEmail] NVARCHAR (50) NOT NULL,
[Phone] NVARCHAR (50) NOT NULL,
[City] NVARCHAR (50) NOT NULL,
[LastLoginDate] DATETIME NULL,
[CreatedDate] DATETIME NULL,
PRIMARY KEY CLUSTERED ([Seller_ID] ASC),
CONSTRAINT [FK_Sellers_Users_Username] FOREIGN KEY ([SUsername]) REFERENCES [Users]([Username]),
CONSTRAINT [FK_Sellers_Users_Email] FOREIGN KEY ([SEmail]) REFERENCES [Users]([Email]),
);
CREATE TABLE [dbo].[DeliveryMen] (
[Delivery_ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
[DUsername] NVARCHAR (50) NOT NULL,
[Password] NVARCHAR (50) NOT NULL,
[DEmail] NVARCHAR (50) NOT NULL,
[Phone] NVARCHAR (50) NOT NULL,
[City] NVARCHAR (50) NOT NULL,
[License] VARBINARY (MAX) NOT NULL,
PRIMARY KEY CLUSTERED ([Delivery_ID] ASC),
CONSTRAINT [FK_DeliveryMen_Users_Username] FOREIGN KEY ([DUsername]) REFERENCES [Users]([Username]),
CONSTRAINT [FK_DeliveryMen_Users_Email] FOREIGN KEY ([DEmail]) REFERENCES [Users]([Email]),

Failure to make Foreign keys with two tables

I am in the process of building the website for the Linq, and the way that I need is to use Foreign keys to precisely set the same with my users table.ยจ
I have assured me that my Tabler has a primary key because it must be unique content that use grab.
Its a brugere table
CREATE TABLE [dbo].[brugere] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[username] NVARCHAR (255) NOT NULL,
[password] NVARCHAR (255) NOT NULL,
CONSTRAINT [PK_brugere] PRIMARY KEY ([Id]),
CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([brugerid]),
CONSTRAINT [FK_brugere_ToKunde] FOREIGN KEY ([Id]) REFERENCES [KundeData]([brugerid])
);
Poinantal its here
CREATE TABLE [dbo].[pointantal] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[point] INT NOT NULL,
[omrade] NVARCHAR (255) NOT NULL,
[datotid] DATETIME DEFAULT (getdate()) NOT NULL,
[brugerid] INT NOT NULL,
CONSTRAINT [PK_pointantal] PRIMARY KEY ([Id])
);
and KundeData table here
CREATE TABLE [dbo].[KundeData] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Adresse] NVARCHAR (255) NOT NULL,
[Postnr] INT NOT NULL,
[Mobil] INT NOT NULL,
[Byen] NVARCHAR (255) NOT NULL,
[abonnementsId] INT NOT NULL,
[BuyDate] DATETIME DEFAULT (getdate()) NOT NULL,
[prisid] INT NOT NULL,
[HaevedeId] NVARCHAR (255) NULL,
[brugerid] INT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
The error message I receive when I try to updater content is here
Update cannot proceed due to validation errors.
Please correct the following errors and try again.
SQL71516 :: The referenced table '[dbo].[pointantal]' contains no
primary or candidate keys that match the referencing column list in
the foreign key. If the referenced column is a computed column, it
should be persisted. SQL71516 :: The referenced table
'[dbo].[KundeData]' contains no primary or candidate keys that match
the referencing column list in the foreign key. If the referenced
column is a computed column, it should be persisted.
A foreign key can only reference a primary key or unique column. You can either add a unique constraint to the columns that you are referencing:
CREATE TABLE [dbo].[pointantal] (
...
CONSTRAINT AK_BrugerID UNIQUE(brugerid)
Or you can change your constraint to actually reference the primary key in your tables:
CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([Id])
However, it seems like you really want the brugerid column of the pointantal and KundeData tables to access an Id (which is a unique column) in the brugere table. In this case, you put the foreign key on those tables and have it access the primary key of the bruger table. The following code runs sucessfully on my system:
CREATE TABLE [dbo].[brugere] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[username] NVARCHAR (255) NOT NULL,
[password] NVARCHAR (255) NOT NULL,
CONSTRAINT [PK_brugere] PRIMARY KEY ([Id])
);
CREATE TABLE [dbo].[pointantal] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[point] INT NOT NULL,
[omrade] NVARCHAR (255) NOT NULL,
[datotid] DATETIME DEFAULT (getdate()) NOT NULL,
[brugerid] INT NOT NULL,
CONSTRAINT [PK_pointantal] PRIMARY KEY ([Id]),
CONSTRAINT [FK_point_ToBrugere] FOREIGN KEY ([brugerid]) REFERENCES [brugere]([Id])
);
a foreign key is a field (or collection of fields) in one table that
uniquely identifies a row of another table. In simpler words, the
foreign key is defined in a second table, but it refers to the primary
key in the first table.
Try:
1>Change the Reference column
CREATE TABLE [dbo].[pointantal] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[point] INT NOT NULL,
[omrade] NVARCHAR (255) NOT NULL,
[datotid] DATETIME DEFAULT (getdate()) NOT NULL,
[brugerid] INT NOT NULL,
CONSTRAINT [PK_pointantal] PRIMARY KEY ([Id])
);
CREATE TABLE [dbo].[KundeData] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Adresse] NVARCHAR (255) NOT NULL,
[Postnr] INT NOT NULL,
[Mobil] INT NOT NULL,
[Byen] NVARCHAR (255) NOT NULL,
[abonnementsId] INT NOT NULL,
[BuyDate] DATETIME DEFAULT (getdate()) NOT NULL,
[prisid] INT NOT NULL,
[HaevedeId] NVARCHAR (255) NULL,
[brugerid] INT NOT NULL,
PRIMARY KEY CLUSTERED ([Id])
);
CREATE TABLE [dbo].[brugere] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[username] NVARCHAR (255) NOT NULL,
[password] NVARCHAR (255) NOT NULL,
CONSTRAINT [PK_brugere] PRIMARY KEY ([Id]),
CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([Id]),
CONSTRAINT [FK_brugere_ToKunde] FOREIGN KEY ([Id]) REFERENCES [KundeData]([Id])
);
2>Change The Primary-Key
CREATE TABLE [dbo].[pointantal] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[point] INT NOT NULL,
[omrade] NVARCHAR (255) NOT NULL,
[datotid] DATETIME DEFAULT (getdate()) NOT NULL,
[brugerid] INT NOT NULL,
CONSTRAINT [PK_pointantal] PRIMARY KEY ([brugerid])
);
CREATE TABLE [dbo].[KundeData] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Adresse] NVARCHAR (255) NOT NULL,
[Postnr] INT NOT NULL,
[Mobil] INT NOT NULL,
[Byen] NVARCHAR (255) NOT NULL,
[abonnementsId] INT NOT NULL,
[BuyDate] DATETIME DEFAULT (getdate()) NOT NULL,
[prisid] INT NOT NULL,
[HaevedeId] NVARCHAR (255) NULL,
[brugerid] INT NOT NULL,
PRIMARY KEY CLUSTERED ([brugerid])
);
CREATE TABLE [dbo].[brugere] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[username] NVARCHAR (255) NOT NULL,
[password] NVARCHAR (255) NOT NULL,
CONSTRAINT [PK_brugere] PRIMARY KEY ([Id]),
CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([brugerid]),
CONSTRAINT [FK_brugere_ToKunde] FOREIGN KEY ([Id]) REFERENCES [KundeData]([brugerid])
);

Comment Count on Entry Table (SQL Query)

It may be a simple/specific question but I really need help on that. I have two tables: Entry and Comment in a SQL Server database. I want to show comment count in entry table. And of course comment count will increase when a comment is added. Two tables are connected like this:
Comment.EntryId = Entry.Id
Entry table:
CREATE TABLE [dbo].[Entry] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Subject] NVARCHAR (MAX) NOT NULL,
[Content] NVARCHAR (MAX) NOT NULL,
[Type] NVARCHAR (50) NOT NULL,
[SenderId] NVARCHAR (50) NOT NULL,
[Date] DATE NOT NULL,
[Department] NVARCHAR (50) NULL,
[Faculty] NVARCHAR (50) NULL,
[ViewCount] INT DEFAULT ((0)) NOT NULL,
[SupportCount] INT DEFAULT ((0)) NOT NULL,
[CommentCount] INT DEFAULT ((0)) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Comment table:
CREATE TABLE [dbo].[Comment] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[EntryId] INT NOT NULL,
[SenderId] NVARCHAR (50) NOT NULL,
[Date] DATETIME NOT NULL,
[Content] NVARCHAR (MAX) NOT NULL,
[SupportCount] INT NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
I am showing the entries in a gridview in codebehind (c#). The question is this, what should I write as a query to do this most efficiently? Thanks for help.
Try this:
select e.Id,e.date,count(*) as NumComments
from Entry e
join comment c on c.entryId=e.id
group by e.id,e.date
If there might be no comments, try the following
select e.Id,e.date,count(c.entryId) as NumComments
from Entry e
left join comment c on c.entryId=e.id
group by e.id,e.date
You can use left join for that purpose. Kindly me more specific with what fields you want in gridview
And why do you want commentcount in table (most tables have that 1-many relation and we didn't use that). If you keep that in table you have to update entry table every time when comment is made.

Categories

Resources