Here is the SQL that goes with the demo.
-- Database by Doug -- get code card up here -- Douglas Kline -- 3/21/2016 -- UPDATE - how to change data USE Northwind -- might want to review the SELECT statement -- before using UPDATE -- in particular, review the WHERE clause, -- because UPDATE uses the WHERE clause -- public service announcement /* ***WARNING!*** ***************** *INSERT, UPDATE and DELETE are *data modifying* commands *INSERT, UPDATE and DELETE can do set-at-a-time operations **this means that a seemingly simple statement ** can change millions of records * the database engine will not ask "Are you sure?" * there is no simple "Undo" * professionals normally don't, at the command line, * execute INSERT, UPDATE, and DELETE commands * on a production database * treat these statements with respect! *************************************/ -- the UPDATE statement changes existing rows -- UPDATE changes records, not tables -- again, the row must already exist -- let's look at the Orders table SELECT * FROM Orders ORDER BY orderID desc -- now insert a bogus row to play with: INSERT INTO Orders (ShipCity, CustomerID) VALUES ('Akron', 'VINET') -- see what happened, and note the OrderID SELECT * FROM Orders ORDER BY orderID desc -- OrderID=11099 for the new record -- now that we have a row to modify, here's a simple update -- change the orderdate to right now UPDATE Orders SET OrderDate = GETDATE() WHERE orderID = 11099 -- and check the record SELECT * FROM Orders ORDER BY orderID desc -- note that one record was affected -- because the primary key was set to a single number -- most possible damage is a single record -- let's change two fields UPDATE Orders SET RequiredDate = '20160401 17:00:00.00', ShipName = 'Douglas Kline' WHERE orderID = 11099 -- and check the record SELECT * FROM Orders ORDER BY orderID desc -- so the general form of the UPDATE statement is /* UPDATE <table name> SET <assignment statement list> WHERE <logical expression> or UPDATE <table name> SET <field name 1> = <expression for new value>, <field name 2> = <expression for new value>, <field name 3> = <expression for new value>, ... WHERE <logical expression> */ -- another example UPDATE Orders SET Freight = Freight + 25.0, RequiredDate = DateAdd(week, 1, RequiredDate), ShipCountry = 'U' + 'S' + 'A' WHERE CustomerID = 'VINET' AND EmployeeID IS NULL -- and check the results SELECT * FROM Orders ORDER BY orderID desc -- notice a few things -- several fields are set in the same statement -- the new values are expressions, rather than literala values -- the new value for the requiredDate field is a function of the existing value -- the WHERE clause is logical expression -- potentially, many records could be updated with this single statement -- what happens if the UPDATE would violate the table constraints -- here's the <simplified> definition fo the Order table /* CREATE TABLE Orders OrderID int IDENTITY(1,1) NOT NULL, <-----****** CustomerID nchar(5) NULL, EmployeeID int NULL, OrderDate datetime NULL, RequiredDate datetime NULL, ShippedDate datetime NULL, ShipVia int NULL, Freight money NULL CONSTRAINT [DF_Orders_Freight] DEFAULT ((0)), <-----***** ShipName nvarchar(40) NULL, ShipAddress nvarchar(60) NULL, ShipCity nvarchar(15) NULL, ShipRegion nvarchar(15) NULL, ShipPostalCode nvarchar(10) NULL, ShipCountry nvarchar(15) NULL, CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED ( OrderID ASC ) */ UPDATE Orders SET OrderID = 500000 WHERE OrderID = 11099 -- Cannot update identity column 'OrderID'. -- IDENTITY columns are not update-able UPDATE Orders SET CustomerID = 'Barney' WHERE OrderID = 11099 -- String or binary data would be truncated. -- CustomerID is nchar(5), and 'Barney' is 6 characters UPDATE Orders SET CustomerID = 'Barne' WHERE OrderID = 11099 -- The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_Orders_Customers". -- The conflict occurred in database "Northwind", table "dbo.Customers", column 'CustomerID'. -- that would violate referential constraint -- 'Barne' doesn't exist in the Customers table UPDATE Orders SET CustomerID = 'VINET' WHERE OrderID = 50000 -- no such record, 0 rows affected -- no error - you need to check rows affected if it's important -- in summary, -- UPDATE modifies fields in existing rows -- specify values according to their data type - you have to know the data types -- various things could "block" an UPDATE -- these "blocks" are your friends! they keep your data clean! -- sometimes zero rows are updated - that's okay -- sometimes millions of rows are updated! -- treat INSERT, UPDATE, and DELETE with respect! -- Database by Doug -- Douglas Kline -- 3/21/2016 -- UPDATE - how to change data /* DELETE FROM Orders WHERE OrderID > 11077 */
No comments:
Post a Comment