डेटाबेस में अद्वितीय अनुक्रमित कॉलम मान स्वैप करें

मेरे पास डेटाबेस तालिका है और फ़ील्ड में से एक (प्राथमिक कुंजी नहीं) पर एक अनूठी अनुक्रमणिका है। अब मैं दो पंक्तियों के लिए इस कॉलम के तहत मूल्यों को स्वैप करना चाहता हूं। यह कैसे किया जा सकता है? मुझे पता है कि दो हैक हैं:

  1. दोनों पंक्तियां हटाएं और उन्हें दोबारा डालें
  2. पंक्तियों को किसी अन्य मूल्य के साथ अपडेट करें और स्वैप करें और फिर वास्तविक मान पर अपडेट करें।

लेकिन मैं इनके लिए नहीं जाना चाहता क्योंकि वे समस्या का उचित समाधान नहीं लगते हैं। क्या कोई मेरी मदद कर सकता हैं?

0
जोड़ा संपादित
विचारों: 1
कॉलम का नाम बदलें?
जोड़ा लेखक MatBailie, स्रोत

19 उत्तर

GDAL user-friendliness is basically nonexistent, but hot damn does it ever work well. I wrote up this guide to my own georeferencing experiments a few years ago: http://mike.teczno.com/notes/flea-market-mapping.html

यह बहुत पुराना है, लेकिन बुनियादी तत्व वहां हैं: अपनी छवि और संदर्भ मानचित्र के बीच मिलान बिंदु खोजें (अब मैं http://getlatlon की अनुशंसा करता हूं। कॉम http://gorissen.info पर एक के पक्ष में), वर्चुअल रास्टर को दस्तक देने के लिए gdal_translate का उपयोग करें, और फिर आप ' फिर से मूल रूप से इस अर्थ में किया गया है कि परिणामी वीआरटी फ़ाइल को GeoTIFF या अपनी पसंद के टाइल में परिवर्तित किया जा सकता है।

I'm doing a lot with this right now, including collaborating with Tim Waters on the excellent server-side Map Warper mentioned in this thread, so there may be some new stuff in the near future loosely based on some experiments I did in JS last year: http://mike.teczno.com/notes/canvas-warp.html

22
जोड़ा
Michal, बहुत अच्छा धन्यवाद! मैं पिक्सेल स्थान को खोजने का उत्सुक था और आप उल्लेख करते हैं कि आपने फ़ोटोशॉप की जानकारी पैलेट का उपयोग किया है, जो सहायक है। मुझे लगता है कि मैं पहले आदेश परिवर्तन का उपयोग कर दूर हो सकता हूं। सारी जानकारी के लिए शुक्रिया!
जोड़ा लेखक TiTi, स्रोत
क्यूजीआईएस 1.5 को अभी जारी किया गया है और चेंजलॉग ( qgis.org/ एन/घटक/सामग्री/आलेख/108.html ) मैंने देखा कि "क्यूजीआईएस कोर में जीडीएएल रास्टर टूल्स प्लगइन शामिल करना"।
जोड़ा लेखक TiTi, स्रोत

मुझे दो वेब-आधारित समाधानों के बारे में पता है जो देखने के लायक हो सकते हैं:

मुझे पूरा यकीन है कि टिम वाटर्स ने अपना कोड सोर्स किया है, इसलिए यदि ये विशेष उपकरण आपकी ज़रूरतों के अनुरूप नहीं हैं, तो उनके स्रोत को देखकर आपको कुछ अंतर्दृष्टि मिल सकती हैं।

क्षमा करें, मैं एक से अधिक बाहरी लिंक पोस्ट नहीं कर सकता क्योंकि मैं प्रतिष्ठित रूप से कम से कम हूं।

10
जोड़ा
अब आप और अधिक लिंक जोड़ने में सक्षम होना चाहिए :)
जोड़ा लेखक Greg, स्रोत
दिलचस्प बात यह है कि मैं सिर्फ दूसरे दिन मैपवार्पर को देख रहा था। स्रोत गिटहब पर है: github.com/timwaters/mapwarper
जोड़ा लेखक cynicalman, स्रोत

मुझे QGis का georeferencer एक बिंदु और क्लिक टूल के लिए बहुत सभ्य होने के लिए मिलता है। मैंने एक छोटी सी मार्गदर्शिका लिखी - क्यूजीआईएस के साथ छवि भूगर्भांकन - जो थोड़ा कनाडाई डेटा- स्रोत विशिष्ट है, लेकिन QGis में मनमाने ढंग से मानचित्र प्राप्त करने के लिए आपको आवश्यक सभी चरणों के माध्यम से चलता है।

7
जोड़ा

मुझे QGis का georeferencer एक बिंदु और क्लिक टूल के लिए बहुत सभ्य होने के लिए मिलता है। मैंने एक छोटी सी मार्गदर्शिका लिखी - क्यूजीआईएस के साथ छवि भूगर्भांकन - जो थोड़ा कनाडाई डेटा- स्रोत विशिष्ट है, लेकिन QGis में मनमाने ढंग से मानचित्र प्राप्त करने के लिए आपको आवश्यक सभी चरणों के माध्यम से चलता है।

7
जोड़ा

आप MapWindow में छवि सुधारक प्लग-इन का भी उपयोग कर सकते हैं। यह एक उन्नत 4 या 6 बिंदु एल्गोरिदम का उपयोग करता है।

2
जोड़ा

आप MapWindow में छवि सुधारक प्लग-इन का भी उपयोग कर सकते हैं। यह एक उन्नत 4 या 6 बिंदु एल्गोरिदम का उपयोग करता है।

2
जोड़ा

चूंकि आप हवाई छवियों का उपयोग कर रहे हैं: क्या आपको ऑर्थोरिफिकेशन की आवश्यकता है? उस मामले में मुझे लगता है कि आईएलडब्ल्यूआईएस आपकी सबसे अच्छी शर्त होगी, हालांकि ग्रेस भी इसका समर्थन करता है (मैंने हालांकि खुद को कोशिश नहीं की है)।

आईएलडब्ल्यूआईएस के लिए कार्य प्रवाह का वर्णन यहां दिया गया है: http://spatial-analyst.net/PDF/TN_Ortofoto_in_ILWIS.pdf

2
जोड़ा
GRASS ऑर्थोरेक्टीफिकेशन वर्कफ़्लो यहां उपलब्ध है: grassbook.org -> बाएं मेनू -> नमूना अध्याय: -> एरियल + ऑर्थो (पीडीएफ)
जोड़ा लेखक Dag Haavi Finstad, स्रोत

ओपनईवी एफडब्लूटीएल के साथ आता है, मेरे लिए ठीक लगता है लेकिन मैं आसानी से क्यूजीआईएस में 300 एमबी छवियों को लोड करता हूं और वहां उनके साथ सौदा करता हूं। इसलिए मैं इसे केवल आकस्मिक उपयोग से अनुशंसा कर सकता हूं।

http://OpenEV.sourceforge.net

एनआईटीएफ शामिल है

और जीडीएएल के साथ बनाया गया है

1
जोड़ा

अगर आपके पास अपनी छवि के लिए * .geom फ़ाइल है या बना सकती है, तो आप ऑर्थोइजन का उपयोग कर सकते हैं अपनी इमेजरी को क्वार्थोरेटिफाइड करने के लिए gdal।

1
जोड़ा

मुझे यह भी लगता है कि # 2 सबसे अच्छा शर्त है, हालांकि कुछ गलत मिड-अपडेट होने पर मुझे लेनदेन में लपेटना होगा।

अलग-अलग मानों के साथ अद्वितीय इंडेक्स मानों को अपडेट करने के लिए एक विकल्प (चूंकि आपने पूछा) पंक्तियों में अन्य सभी मानों को अन्य पंक्तियों में अपडेट करना होगा। ऐसा करने का मतलब है कि आप अकेले अद्वितीय इंडेक्स मान छोड़ सकते हैं, और अंत में, आप जो डेटा चाहते हैं उसके साथ समाप्त हो जाते हैं। सावधान रहें, अगर किसी अन्य तालिका में विदेशी तालिका के संबंध में इस तालिका का संदर्भ मिलता है, तो डीबी में सभी रिश्ते बरकरार रहते हैं।

0
जोड़ा

ओरेकल के लिए एक विकल्प है, डिफर्ड, लेकिन आपको इसे अपनी बाधा में जोड़ना होगा।

SET CONSTRAINT emp_no_fk_par DEFERRED; 

पूरे सत्र के दौरान स्थगित सभी बाधाओं को रोकने के लिए, आप ALTER सत्र सेट बाधाओं = DEFERRED कथन का उपयोग कर सकते हैं।

स्रोत

0
जोड़ा

ओरेकल ने अखंडता जांच स्थगित कर दी है जो वास्तव में हल करता है, लेकिन यह SQL सर्वर या MySQL में उपलब्ध नहीं है।

0
जोड़ा

SQL सर्वर में, MERGE कथन उन पंक्तियों को अपडेट कर सकता है जो आम तौर पर एक अद्वितीय कुंजी / INDEX को तोड़ देंगे। (बस इसका परीक्षण किया क्योंकि मैं उत्सुक था।)

हालांकि, आपको मेर्ज डब्ल्यू / आवश्यक पंक्तियों की आपूर्ति के लिए एक अस्थायी तालिका / चर का उपयोग करना होगा।

0
जोड़ा

जादू शब्द डिफ्रैबल यहां है:

DROP TABLE ztable CASCADE;
CREATE TABLE ztable
    ( id integer NOT NULL PRIMARY KEY
    , payload varchar
    );
INSERT INTO ztable(id,payload) VALUES (1,'one' ), (2,'two' ), (3,'three' );
SELECT * FROM ztable;


    -- This works, because there is no constraint
UPDATE ztable t1
SET payload=t2.payload
FROM ztable t2
WHERE t1.id IN (2,3)
AND t2.id IN (2,3)
AND t1.id <> t2.id
    ;
SELECT * FROM ztable;

ALTER TABLE ztable ADD CONSTRAINT OMG_WTF UNIQUE (payload)
    DEFERRABLE INITIALLY DEFERRED
    ;

    -- This should also work, because the constraint 
    -- is deferred until "commit time"
UPDATE ztable t1
SET payload=t2.payload
FROM ztable t2
WHERE t1.id IN (2,3)
AND t2.id IN (2,3)
AND t1.id <> t2.id
    ;
SELECT * FROM ztable;

परिणाम:

DROP TABLE
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ztable_pkey" for table "ztable"
CREATE TABLE
INSERT 0 3
 id | payload
----+---------
  1 | one
  2 | two
  3 | three
(3 rows)

UPDATE 2
 id | payload
----+---------
  1 | one
  2 | three
  3 | two
(3 rows)

NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "omg_wtf" for table "ztable"
ALTER TABLE
UPDATE 2
 id | payload
----+---------
  1 | one
  2 | two
  3 | three
(3 rows)
0
जोड़ा
क्या यह MySQL में काम करता है?
जोड़ा लेखक Marco Demaio, स्रोत
@MarcoDemaio मुझे नहीं पता। मुझे डर नहीं है: चूंकि MySQL आत्म-जुड़ने से अपडेट की अनुमति नहीं देता है, मुझे लगता है कि यह गंदा पढ़ता है। लेकिन आप कोशिश कर सकते हैं ...
जोड़ा लेखक wildplasser, स्रोत
साफ, सरल और अच्छा काम करता है, धन्यवाद आदमी :)
जोड़ा लेखक Aldos, स्रोत

मेरी भी यही समस्या है। PostgreSQL में मेरा प्रस्तावित दृष्टिकोण यहां दिया गया है। मेरे मामले में, मेरी अनूठी अनुक्रमणिका एक अनुक्रम मान है, जो मेरी पंक्तियों पर एक स्पष्ट उपयोगकर्ता-आदेश को परिभाषित करती है। उपयोगकर्ता वेब-ऐप में चारों ओर पंक्तियों को घुमाएगा, फिर परिवर्तन सबमिट करें।

मैं एक "पहले" ट्रिगर जोड़ने की योजना बना रहा हूं। उस ट्रिगर में, जब भी मेरा अद्वितीय इंडेक्स मान अपडेट किया जाता है, तो मैं यह देखने के लिए देखता हूं कि कोई अन्य पंक्ति पहले से ही मेरा नया मान रखती है या नहीं। यदि ऐसा है, तो मैं उन्हें अपना पुराना मूल्य दूंगा, और प्रभावी ढंग से मूल्य को चुरा लेगा।

मुझे उम्मीद है कि PostgreSQL मुझे पहले ट्रिगर में इस शफल करने की अनुमति देगा।

मैं वापस पोस्ट करूंगा और आपको अपना लाभ बता दूंगा।

0
जोड़ा

मान लें कि आप उन दो पंक्तियों के पीके को जानते हैं जिन्हें आप अपडेट करना चाहते हैं ... यह SQL सर्वर में काम करता है, अन्य उत्पादों के लिए बात नहीं कर सकता है। एसक्यूएल कथन स्तर पर परमाणु है (माना जाता है):

CREATE TABLE testing
(
    cola int NOT NULL,
    colb CHAR(1) NOT NULL
);

CREATE UNIQUE INDEX UIX_testing_a ON testing(colb);

INSERT INTO testing VALUES (1, 'b');
INSERT INTO testing VALUES (2, 'a');

SELECT * FROM testing;

UPDATE testing
SET colb = CASE cola WHEN 1 THEN 'a'
                WHEN 2 THEN 'b'
                END
WHERE cola IN (1,2);

SELECT * FROM testing;

तो आप यहां से जाएंगे:

cola    colb
------------
1       b
2       a

सेवा मेरे:

cola    colb
------------
1       a
2       b
0
जोड़ा
यह MySQL में मेरे लिए काम नहीं किया।
जोड़ा लेखक activout.se, स्रोत

मुझे लगता है कि आपको समाधान 2 के लिए जाना चाहिए। मुझे पता है कि किसी भी SQL संस्करण में कोई 'स्वैप' फ़ंक्शन नहीं है।

यदि आपको नियमित रूप से ऐसा करने की ज़रूरत है, तो मैं इस डेटा का उपयोग कर रहे सॉफ्टवेयर के अन्य हिस्सों के आधार पर समाधान 1 का सुझाव देता हूं। यदि आप सावधान नहीं हैं तो आप लॉकिंग समस्याएं प्राप्त कर सकते हैं।

लेकिन संक्षेप में: आपके द्वारा प्रदान किए गए लोगों की तुलना में कोई अन्य समाधान नहीं है।

0
जोड़ा

SQL सर्वर के साथ काम करने वाला एक और तरीका है: अपने अद्यतन विवरण में एक temp तालिका में शामिल हों।

समस्या एक ही मूल्य एक ही समय के साथ दो पंक्तियों के कारण होती है, लेकिन यदि आप दोनों पंक्तियों को एक साथ (अपने नए, अद्वितीय मूल्यों) में अपडेट करते हैं, तो कोई बाधा उल्लंघन नहीं होता है।

छद्म कोड:

-- setup initial data values:
insert into data_table(id, name) values(1, 'A')
insert into data_table(id, name) values(2, 'B')

-- create temp table that matches live table
select top 0 * into #tmp_data_table from data_table

-- insert records to be swapped
insert into #tmp_data_table(id, name) values(1, 'B')
insert into #tmp_data_table(id, name) values(2, 'A')

-- update both rows at once! No index violations!
update data_table set name = #tmp_data_table.name
from data_table join #tmp_data_table on (data_table.id = #tmp_data_table.id)

इस तकनीक के लिए रिच एच के लिए धन्यवाद। - निशान

0
जोड़ा
शायद यह थोड़ा पुराना हो सकता है लेकिन मैं अपने Silverlight ऐप के लिए 'पुनः क्रमबद्ध' पृष्ठ करने की कोशिश कर रहा था क्योंकि क्लाइंट अपनी रिपोर्ट को एक विशिष्ट क्रम से सॉर्ट करना चाहता था - मैंने एक प्रकार का कॉलम जोड़ा लेकिन चूंकि यह एक अनूठी कुंजी थी इसे अद्यतन करने में परेशानी हो रही है। मैं एक टेबल वैरिएबल का उपयोग कर समाप्त हुआ लेकिन सिद्धांत एक जैसा है (मुझे अस्थायी होने के लिए अस्थायी सारणी पसंद नहीं है!)। विचार के लिए धन्यवाद :)
जोड़ा लेखक Charleh, स्रोत

मैं आमतौर पर एक मान के बारे में सोचता हूं कि मेरी तालिका में बिल्कुल कोई अनुक्रमणिका नहीं हो सकती है। आमतौर पर - अद्वितीय कॉलम मानों के लिए - यह वास्तव में आसान है। उदाहरण के लिए, कॉलम 'स्थिति' के मूल्यों के लिए (कई तत्वों के क्रम के बारे में जानकारी) यह 0 है।

फिर आप वैल्यू ए को वैरिएबल में कॉपी कर सकते हैं, इसे वैल्यू बी के साथ अपडेट करें और फिर अपने वैरिएबल से वैल्यू सेट करें। दो प्रश्न, हालांकि मुझे कोई बेहतर समाधान नहीं पता है।

0
जोड़ा